WCF 设计和实现服务协定

WCF 术语:
? 消息
– 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头。
? 服务
– 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作。
? 终结点
– 终结点是用来发送或接收消息(或执行这两种操作)的构造。 终结点包括一个定义消息可以发送到的目的地的位置(地址)、一个描述消息应如何发送的通信机制规范(绑定)以及对于可以在该位置发送或接收(或两者皆可)的一组消息的定义(服务协定)— 该定义还描述了可以发送何种消息。

– WCF 服务作为一个终结点集合向外界公开。

小注:

WCF服务即在服务端为客户端提供一系列方法的集合。这些方法可以是在一个类中的,也可以是包含在不同类中的。终结点即是指这些类,即一系列方法的入口。

创建服务协定: 

? 类或接口都可以定义服务协定
? 建议使用接口,因为接口可以直接对服务协定建模
? 服务协定接口具有托管接口的所有优点:
– 服务协定接口可以扩展任何数量的其他服务协定接口。
– 一个类可以通过实现服务协定接口来实现任意数量的服务协定。
– 可以通过更改接口实现来修改服务协定的实现,而让服务协定保持不变。
– 可以通过实现旧接口和新接口来确定服务的版本。 老客户端连接到原始版本,而新客户端则可以连接到较新的版本。

? 定义服务协定
– 在类或接口上使用 ServiceContractAttribute 属性标记

? 定义服务操作
 – 在方法上使用 OperationContractAttribute 属性对其进行标记

? 参数和返回值
– 每个操作都有一个返回值和一个参数,即使它们为 void。 可以使用局部方法将对对象的引用从一个对象传递到另一个对象,但与局部方法不同的是,服务操作不会传递对对象的引用, 它们传递的只是对象的副本。
– 这一点很重要,这是因为参数或返回值中使用的每个类型都必须是可序列化的,换言之,该类型的对象必须能够转换为字节流,并能够从字节流转换为对象。
– 默认情况下,基元类型是可序列化的,.NET Framework 中的很多类型都是可序列化的。

创建服务协定  服务操作的消息模式

1、请求/答复模式
– 通过请求/答复模式,请求发送方(客户端应用程序)将接收与请求相关的答复。 这是默认的模式,因为它既支持传入操作(一个或多个参数传递到该操作中 ),也 支持返回操作(该操作将一个或多个输出值传回给调用方)

[OperationContract]
string Hello(string greeting);

–请注意,除非指定其他基础消息模式,否则,即使服务操作返回void(在 Visual Basic 中为 Nothing),也属于请求/答复消息交换。
– 操作的结果是:除非客户端异步调用操作,否则客户端将停止处理,直到收到返回消息,即使该消息正常情况下为空时也是如此。
缺点
– 如果执行操作需要很长的时间,则会降低客户端性能和响应能力
? 优点
– 响应消息中可返回 SOAP 错误,这表明可能在通信或处理中发生了一些与服务有关的错误状况

2、单向模式

– 如果 WCF 服务应用程序的客户端不必等待操作完成,并且不处理 SOAP 错误,则该操作可以指定单向消息模式。
–  单向操作是客户端调用操作并在 WCF 将消息写入网络后继续进行处理的操作。 通常这意味着,除非在出站消息中发送的数据极其庞大,否则客户端几乎立即继续运行(除非发送数据时出错)。此种类型的消息交换模式支持从客户端到服务应用程序的类似于事件的行为。
– 若要为返回 void 的操作指定单向消息交换,请将 IsOneWay 属性设置为 true,默认为false.

[OperationContract(IsOneWay=true)]
void Hello(string greeting);

此方法与前面的请求/答复示例相同,但是,将 IsOneWay属性设置为 true 意味着尽管方法相同,服务操作也不会发送返回消息,而客户端将在出站消息抵达通道层时立即返回。

3、双工模式

– 双工模式的特点是,无论使用单向消息发送还是请求/答复消息发送方式,服务和客户端均能够独立地向对方发送消息。 对于必须直一( 接与客户端通信或向消息交换的任意 方提供异步体验 包括类似于事件的行为)的服务来说,这种双向通信形式非常有用
– 由于存在与客户端通信的附加机制,双向模式比请求/答复或单向模式要略为复杂
– 若要设计双工协定,还必须设计回调协定,并将该回调协定的类型分配给标记服务协定的 ServiceContractAttribute 属性 (attribute)的 CallbackContract 属性 (property)。
– 若要实现双工模式,您必须创建第二个接口,该接口包含在客户端调用的方法声明

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples",SessionMode=SessionMode.Required,CallbackContract=typeof(ICalculatorDuplexCallback))]
public interface ICalculatorDuplex
{
	[OperationContract(IsOneWay = true)]
	void Clear();
}
public interface ICalculatorDuplexCallback
{
	[OperationContract(IsOneWay = true)]
	void Equals(double result);
	[OperationContract(IsOneWay = true)]
	void Equation(string eqn);
}

小注:

? 面向服务的应用程序(例如 Windows Communication Foundation(WCF) 应用程序)设计为与 Microsoft 平台和非 Microsoft 平台上的最大可能数量的客户端应用程序进行互操作。
? 为了获得最大可能的互操作性,建议您使用 DataContractAttribute 和DataMemberAttribute 属性对您的类型进行标记,以创建数据协定。
? 数据协定是服务协定的一部分,用于描述您的服务操作交换的数据。

? 数据协定是可选的样式协定:除非您显式应用数据协定属性,否则不会序列化任何类型或数据成员
? 数据协定与托管代码的访问范围无关 可以对私有数据成员进行序列化,并将其发送到其他位置,以便可以公开访问它们
? WCF 处理用于启用操作功能的基础 SOAP 消息的定义,并处理数据类型到消息正文的序列化和从消息正文进行的反序列化。 数据类型一旦序列化,您就无需在设计操作时考虑基础消息交换基础结构
? 可以使用其他序列化机制。 标准 ISerializable, SerializableAttribute和 IXmlSerializable 机制都可用于处理数据类型到基础 SOAP 消息的序列化,这些消息可将数据类型从一个应用程序带到另一个应用程序

Out 和Ref参数

? 大部分情况下,您可以使用 in 参数(Visual Basic 中为 ByVal)、out 和 ref 参数(Visual Basic 中为 ByRef)。 由于 out 和 ref 参数都指示数据是从操作返回的,类似如下的操作签名会指定需要请求/答复操作,即使操作签名返回 void 也是如此

[ServiceContract]
public interface IMyContract
{
[OperationContract]
void PopulateData(ref CustomDataType data);
}

? 使用 out 或 ref 参数要求操作具有基础响应消息,才可以将已修改的对象传回。 如果操作是单向操作,则将在运行时引发InvalidOerationExcetion 异常

小注:

本文整理自:徐长龙 跟我一起从零开始学WCF系列课程(2):设计和实现服务协定 (Level 200) 教程


版权声明:作者:jiankunking 出处:http://blog.csdn.net/jiankunking 本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

时间: 2024-10-23 18:58:49

WCF 设计和实现服务协定的相关文章

WCF 设计和实现服务协定(01)

作者:jiankunking 出处:http://blog.csdn.net/jiankunking WCF 术语: ? 消息 – 消息是一个独立的数据单元,它可能由几个部分组成,包含消息正文和消息头.? 服务 – 服务是一个构造.它公开一个或多个终结点.当中每一个终结点都公开一个或多个服务操作.? 终结点 – 终结点是用来发送或接收消息(或执行这两种操作)的构造. 终结点包含一个定义消息能够发送到的目的地的位置(地址).一个描写叙述消息应怎样发送的通信机制规范(绑定)以及对于能够在该位置发送或

从零开始学WCF(2):设计和实现服务协定

消息 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头 服务 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个服务操作 终结点 终结点是用来发送或接受消息(或执行这两种操作)的构造. 终结点包括: 一个定义消息可以发送到的目的地的位置(地址 Address) 一个描述消息应如何发送的通信机制的规范(绑定 Binding) 对于可以在该位置发送或接受(或两者皆可)的一组消息的定义(服务协定)该定义还描述了可以发送何种消息. WCF服务作为一个终结点集合向外

WCF基础之设计和实现服务协定

本来前面还有一个章节“WCF概述”,这章都是些文字概述,就不“复制”了,直接从第二章开始. 当然学习WCF还是要些基础的.https://msdn.microsoft.com/zh-cn/hh148206这个就是“原文”了,喜欢WCF的可以自己去下载. WCF简单术语: 消息:消息是一个独立的数据单元,主要由消息头和消息正文组成,入门的时候我对它的理解简单说:发送一个消息,就是调用了一个方法,具体的以后再说. 服务:服务说简单点就是终结点的集合. 终节点:即包含我们所谓的WCF的ABC三要素的接

菜鸟眼中的WCF(2)—服务协定

在上一篇文章中简单的对WCF进行了讲解并做了一个简单的实例,那么今天就继续对它进行解析--服务协定的初探. 说到协定大家肯定不陌生,只要参加了工作就一定会签订各种协定,比如合同的签订,我们就是其中的一方,按着这个双方签订的合同来工作,它授予你什么权限,你就有什么权限,不能做本职外的工作.各位想一想这个合同的协议,像不像我们这里说的服务协定?是啊,服务协定其实没啥了不起的,刚才签下合作协议的个人和公司分别叫做"客户端"和"服务器". 服务协定告诉客户端,哪些方法你可以

【WCF全析(一)】--服务协定及消息模式

上周微软开发布会说.NET支持完全跨平台和并开放Core源码的新闻,让我们顿时感到.NET要迎来它的春天.虽然早在几年前.NET就能开发Android和IOS,但是这次的跨平台把Linux都放到了微软战略之中,以后的.NET Developer就可以使用Vs开发Linux应用了,Developer又有了新的选择,从微软的战略转型也可以看出互联网已经步入到了新的模式,以后不再是PC的时代,移动互联和云时代已经到来. 最近做项目时使用到了WCF,项目把数据层和程序层进行了分割,相互之间的数据传输使用

【架构之路之WCF全析(一)】--服务协定及消息模式

上周微软开发布会说.NET支持完全跨平台和并开放Core源码的新闻,让我们顿时感到.NET要迎来它的春天.虽然早在几年前.NET就能开发Android和IOS,但是这次的跨平台把Linux都放到了微软战略之中,以后的.NET Developer就可以使用Vs开发Linux应用了,Developer又有了新的选择,从微软的战略转型也可以看出互联网已经步入到了新的模式,以后不再是PC的时代,移动互联和云时代已经到来. 最近做项目时使用到了WCF,项目把数据层和程序层进行了分割,相互之间的数据传输使用

WCF初探-14:WCF服务协定

前言: 在前面的文章中,我们定义的服务协定上都会有一个ServiceContract的特性来修饰,这是因为服务契约的实现要靠ServiceContractAttribute 属性定义,然后使用一个或多个类(或接口)方法中的 OperationContractAttribute 属性定义协定的服务操作. 实现服务协定后并将其与WCF 绑定和 EndpointAddress 对象一起使用时,此服务协定将公开以供客户端使用. 公开的信息由 ServiceContractAttribute 表示,其接口

WCF系列教程之WCF服务协定

本文参考自:http://www.cnblogs.com/wangweimutou/p/4422883.html,纯属读书笔记,加深记忆 一.服务协定简介: 1.WCF所有的服务协定层里面的服务接口,都有一个ServiceContract的特性修饰,服务接口里面的操作方法都有OperationContract特性修饰,why? (1).服务契约的实现要靠ServiceContractAttribute 属性定义 (2).服务契约方法的实现要靠 OperationContractAttribute

[转] 传说中的WCF(2):服务协定的那些事儿

上一篇文章中,我们抛出了N个问题:WCF到底难不难学?复杂吗?如果复杂,可以化繁为简吗? 其实,这些问题的答案全取决于你的心态,都说"态度决定一切",这句话,不知道各位信不信,反正我是信了.首先,敢于挑战自我,乐于接受新事物的人,就不会觉得有啥难学的,"世上有难事,只怕有心人":再者,WCF当然复杂了,整个.NET框架都复杂,但不难学,因为.NET有一个先天性优点--集成性和统一性严重地好,这也是我乐于研究.NET的主要原因之一,复杂但不混乱.一个统一的国家总比一个