两个网站放在同一个服务器 备案,wordpress导入网站,网站建设业务员,怎么用手机开发appWCF 基础之契约(Contract)[转] 1. WCF 基础之契约#xff08;Contract#xff09;契 约(Contract)是 WCF 的消息标准#xff0c;告知客户端如何与服务器联系交互。契约是平台中立的#xff0c;也就说我们可以使用其它平台(包括开发和系统平台)来调用服务。WCF 中包含 4 种契… WCF 基础之契约(Contract)[转] 1. WCF 基础之契约Contract契 约(Contract)是 WCF 的消息标准告知客户端如何与服务器联系交互。契约是平台中立的也就说我们可以使用其它平台(包括开发和系统平台)来调用服务。WCF 中包含 4 种契约分别是用于定义服务操作(Operations)的 Service Contract定义自定义数据结构的 Data Contract定义错误异常的 *Fault Contract以及直接控制消息格式的 Message Contract。它们算是WCF的核心之一如果你要使用WCF就需要了解他们。 Service contracts : 定义客户端可以使用哪些服务操作。Data contracts : 定义服务传输的数据类型。WCF 定义了一些隐式数据契约像 int、string 等更多时候我们需要使用 DataContractAttribute 显式定义那些自定义数据结构的数据契约。Fault contracts : 定义服务引发的错误信息以及如何传递这些异常给客户端。Message contracts : 允许我们直接操控服务消息内容和格式可以是类型化或无类型的。2. 服务契约(Service Contract)一般情况下我们用接口(Interface)来定义服务契约(Service Contract)。虽然我们也可以使用 Class但使用接口的好处更明显一些。便于契约的继承不同根的类型可以自由实现相同的契约。 同一服务类型可以实现多个契约。和接口隔离原则相同我们随时可以修改服务类型。便于制定版本升级策略让新老版本的服务契约同时使用。WCF 使用特性 ServiceContractAttribute 标定服务契约OperationContractAttribute 标定服务方法。 ServiceContract public interface ICalculate { OperationContract double Add(double a, double b); } OperationContract 只能用于 Method只有添加了此特性的方法才能被客户端调用。它甚至可以用来标注私有方法这显然超出了面向对象的规则而更多的是 SOA 的方式。SOA 只是分布式系统的架构体系在架构体系内部我们依然采取面向对象的原则来编码所以标注私有方法是不被推荐的这也是使用接口作为服务契约的一个好处(接 口中无法定义私有方法)。异步 Asynchronous 在WCF中如果在服务契约中建立了异步方法那么客户端代理将同时存在异步和非异步版本。 设置OperationContract的AsyncPattern:True 即可以建立异步方法 双向通讯 Duplex 通 过在服务契约中指定CallbackContract:GetType(ICalculatorDuplexCallback)即可以指定回调接口。 在回调的时候由于系统会确认执行过程。所以为了避免死锁一般加上(IsOneWay:True)关键字。 Oneway 在我们的程序中有些服务是不需要确认是否到达到服务器的或者没有返回值的。这个时候我们可以设置IsOneWay:True 这样WCF便不会等到执行完才返回了。 Session 虽然在SOA中提议每个服务请求都是独立的。但是我们有时候需要保存一些数据比如用户ID。这个时候我们可以把这个数据保存回话中。 WCF中支持3种回话模式 1. Pre-Call: 服务实例被释放客户端抛出 FaultException客户端代理对象无法继续使用。2. Pre-Session: 服务实例被释放会话终止。客户端抛出 FaultException客户端代理对象无法继续使用。3. Singleton: 服务实例依旧运行会话终止。客户端抛出 FaultException客户端代理对象无法继续使用。 流 Stream 在WCF中也支持流传输这时候有点类似打开TCP端口。对于传输大量数据比较有效率例如:上传文件。记得在使用的时候配置好最大消息的大小 ServiceContract 的属性 ConfigurationName 其设置信息在配置文件中的名称。Name / Namespace自定义该服务契约的名称和命名空间。建议设置服务契约的 Name 和 Namespace这样生成的客户端的代理文件会使用自定义名称来命名相关代理类型即便我们日后对服务器端的契约名称进行重构也不会影响到客户端。SessionMode设置服务契约的 Session 方式包括 Allowe、NotAllowed、Required。SessionMode 需要相应的 Binding 支持默认情况下会自动启用另外我们还会和 ServiceBehaviorAttribute.InstanceContextMode 配合使用来管理服务对象的生命周期。CallbackContract设置 duplex 模式时的回调类型。ProtectionLevel指定消息保护方式可以对消息进行加密和签名处理。OperationContract 的属性AsyncPattern用于定义异步服务方法。IsInitiating指示服务方法能否启动一个 Session。IsTerminating指示服务方法调用完成是否结束 Session。3. 数据契约(Data Contract)数据契约Data Contract是用来标识用户自定义类型和序列化。DataContractAttribute、 DataMemberAttribute 来标注自定义数据类型这样我们就可以在服务方法中传递复杂的数据体了。使用之前我们需要添加 System.Runtime.Serialization.dll 引用。由此我们可以看出其基本的开发模式那就是使用 ServiceContract、OperationContract 执行运算而使用 DataContract、DataMember 作为可序列化的数据载体。当然我们也可以使用 Serializable 代替 DataContract。其实数据契约主要是定义数据的格式契约。DataMember()是告诉序列化引擎要序列化的那个部分关于序列化注意一点反序列化时可以访问任一字段作用域关键字不起作用这可能会暴露安全问题。 DataContract public struct Number { DataMember public double Num1; DataMember public double Num2; public Number(double num1, double num2) {this.Num1 num1; this.Num2 num2; } } 复制代码 DataContract 的属性 Name / Namespace自定义名称和命名空间。 DataMember 的属性 Name自定义名称。 IsRequired指示该成员序列化前必须被赋值。 DataContractSerializer 实际上序列化是一个过程不过这个过程大多徐情况下被系统自动实现了。默认情况下WCF 使用 DataContractSerializer 引擎对相关参数进行序列化这也是 WCF 推荐的方式。另外一个选择是 XmlSerializer也就是 ASP.NET Web Service 所使用的序列化引擎。XmlSerializer 仅支持 DataContractSerializer 所支持的部分类型但它允许你使用 XmlAttributeAttribute 等特性对序列化生成的 XML 进行更多的控制。 DataContractSerializer 支持的类型 支持所有的基本类型还包括 XmlElement 和 DateTime 这样的常用类型。 支持使用 DataContractAttribute 标记的类型。 支持使用 SerializableAttribute 标记或者实现 ISerializable 接口的类型。 实现 IXmlSerializable 接口的类型。 大多数集合(含泛型)类型包括常用的 Array、List、IList 等。 KnownTypes 在OO中对象继承是很常见的但如果在WCF直接使用继承后实际上被分成了2个独立的类。这时就需要使用KnownType来标识这样在客户端生成代理后就变成继承的了。 还可以通过配置文件指定 4. 消息契约(Message Contract)消息契约可以算是数据契约的一个分类专为SOAP而生的。可以控制消息的格式。数据是放在Header 还是Body中。非类型化Untyped 可以通过System.ServiceModel.Channels.Message类来直接构造消息不过这个必须指定动作的地址用来确定是那个操作被执行。 这样变可以不用构建类型了不过会很累。。 非包装UnwrappedWCF对消息序列化的时候可以决定是否对消息进行包装。 如果和其他系统整合的话可能需要去掉包装手动控制。 样式 可以通过设置XmlSerializerFormat的Style和Use可以使用样式 使用XMLReader可以通过Message的GetReaderAtBodyContents 可以获取消息的XML部分 5. 错误契约(Fault Contract)错误契约Fault Contract主要是来告诉一个服务或操作产生错误后这个消息是什么样子的。 在SOA中并没有限制客户端是什么平台事实上连服务端也是。只有契约没有变。 华丽的分割线 在WCF中契约分为四种它们分别为 用于定义服务操作的服务契约Service Contract这种级别的契约又包括两种ServiceContract和OperationContract ServiceContract用于类或者结构上用于指示WCF此类或者结构能够被远程调用而OperationContract用于类中的方法Method上用于指示WCF该方法可被远程调用。 [ServiceContract]public interface ICalculate { [OperationContract]double Add(double a, double b); } 复制代码 用于自定义数据结构的数据契约Data Contract数据契约也分为两种DataContract和DataMember.DataContract用于类或者结构上指示 WCF此类或者结构能够被序列化并传输而DataMember只能用在类或者结构的属性(Property)或者字段Field上指示WCF该属 性或者字段能够被序列化传输。 我们还可以使用 DataContractAttribute、DataMemberAttribute 来标注自定义数据类型这样我们就可以在服务方法中传递复杂的数据体了。使用之前我们需要添加 System.Runtime.Serialization.dll 引用。由此我们可以看出其基本的开发模式那就是使用 ServiceContract、OperationContract 执行运算而使用 DataContract、DataMember 作为可序列化的数据载体。当然我们也可以使用 [Serializable] 代替 [DataContract]。 [DataContract]public class User {int _age 27; [DataMember]public int Age { get { return _age; } set { _age value; } } string _userName wang.yq; [DataMember] public string UserName { get { return _userName; } set { _userName value; } } } 复制代码 用于自定错误异常的异常契约Fault Contract FaultContract用于自定义错误异常的处理方式默认情况下当服务端抛出异常的时候客户端能接收到异常信息的描述但这些描述往往格 式统一有时比较难以从中获取有用的信息此时我们可以自定义异常消息的格式将我们关心的消息放到错误消息中传递给客户端此时需要在方法上添加自定 义一个错误消息的类然后在要处理异常的函数上加上FaultContract并将异常信息指示返回为自定义格式。 用于控制消息格式的消息契约Message Contract简单的说它能自定义消息格式包括消息头消息体还能指示是否对消息内容进行加密和签名。 ServiceContract ConfigurationName 其设置信息在配置文件中的名称。Name / Namespace自定义该服务契约的名称和命名空间。建议设置服务契约的 Name 和 Namespace这样生成的客户端的代理文件会使用自定义名称来命名相关代理类型即便我们日后对服务器端的契约名称进行重构也不会影响到客户端。SessionMode设置服务契约的 Session 方式包括 Allowe、NotAllowed、Required。SessionMode 需要相应的 Binding 支持默认情况下会自动启用另外我们还会和 ServiceBehaviorAttribute.InstanceContextMode 配合使用来管理服务对象的生命周期。CallbackContract设置 duplex (双向通信)模式时的回调类型。ProtectionLevel指定消息保护方式可以对消息进行加密和签名处理。OperationContract AsyncPattern用于定义异步服务方法。IsInitiating指示服务方法能否启动一个 Session。IsTerminating指示服务方法调用完成是否结束 Session。DataContract Name / Namespace自定义名称和命名空间。DataMember Name自定义名称。IsRequired指示该成员序列化前必须被赋值。 契约是独立于平台的么 WCF作为一种能够跨平台的体系框架其应用肯定会有异构异网的情况发生那么作为通讯依据的契约能否自动适用于上述情况呢答案是肯定的契约是独立 于平台之外的它只约束通讯的双方应该遵守什么样的规则而丝毫不管双方各自采用的是什么样的技术和什么样的操作系统也只有这样WCF才能有真正的生 命力。 契约和以往哪种技术比较相像又有什么不同 如果非要拿契约和以往的技术相比较的话契约和asp.net xml web service的声明性编程模型甚是相似比如在web service中在类上标记WebServiceAttribute便可以将此类用于远程调用而将方法添加WebMethondAttribute也可 以将其暴露给远程客户端这和WCF中的ServiceContract和OperationContract简直如出一辙但不同的是WCF中的契约 要比Xml Web Service中的要详尽的多比如ServiceContract和OperationContract可以直接使用在接口上面而实现该接口的类就继 承了这种契约声明自动拥有契约所规范的动作和行为这就使得程序员更方便的使用面向接口的编程方式可以使同一服务拥有不同的实现在新旧版本升级的同 时能够使新老版本共同运行。 posted on 2010-10-05 16:40 搏击的小船 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/guanjie20/archive/2010/10/05/2382206.html