WCF学习(三)协定

协定定义了服务提供的功能和客户端可以使用得功能。协定可以完全独立于服务的实现代码。

由WCF定义的协定可以分为4中不同的类型:数据协定、服务协定、消息协定和错误协定。协定可以用.NET属性来指定:

数据协定——数据协定定义了从服务中接收和返回的数据。用于收发消息的类关联了数据协定属性。

服务协定——服务协定用于定描述了服务的WSDL。这个协定用于接口或类定义。

操作协定——操作协定定义了服务的操作,在服务协定中定义。

消息协定——如果需要完全控制SOAP消息,消息协定就可以指定应放在SOAP标题只的数据以及放在SOAP正文只的的数据。

错误协定——错误协定定义了发送给客户端的错误消息。

3.1数据协定

在数据协定中,把CLR类型映射到XML架构。数据协定不同于其它.NET序列化机制。在运行库序列化中,所有字段都会序列化(包括私有字段),而在XML序列化中,只序列化公共字段和属性。数据协定要求用DataMember特性显示标记序列化的字段。无论字段是私有或公共的,还是应用于属性,都可以使用这个特性。

为了独立于平台和版本,如果要求用新版本修改数据,且不破坏旧客户端和服务,使用数据协定是指定要发送哪些数据的最佳方式。还可以使用XML序列化和运行库序列化。XML序列化时ASP.NET Web服务使用得机制,.NET Remoting使用运行库序列化。

3.2版本问题

创建数据协定的新版本时,注意更改的种类,如果应同时支持新旧客户端和新旧服务,就应该执行相应的操作。

在定义协定时,应使用DataContract属性的Namespace属性添加XML名称空间信息。如果创建了新数据协定的新版本,破坏了兼容性,就应该改变这个名称空间。如果只添加了可选的成员,就没有破坏协定——这个就是一个可兼容性改变。旧客户端仍可以给新服务发送消息,因为不需要其它数据。新客户端可以给旧服务发送消息,因为旧服务仅或略额外的数据。

删除字段或添加需要的字段会破坏协定。此时还应该改变XML名称空间。名称空间可以包含年份和月份,如http://thinktecture.com/SampleServices/2012/08。每次做破坏性的修改时,都需要改边名称空间,如把年份和月份改为实际值。

3.3服务协定

服务协定定义了服务可以执行的操作。ServiceContract特性于接口或类一起使用。来定义服务协定。由服务提供的方法通过接口应用OperationContract特性,如下所示:

在服务协定中,也可以用[DeliveryRequirements]特性定义服务的传输要求。RequirementOrderedDelivery属性指定所发送的消息必须相同的顺序到达。使用QuenenedDeliveryRequirements属性可以指定,消息以断开连接的模式发送,例如,使用消息队列。

3.4消息协定

如果需要完全控制SOAP消息,就可以使用消息协定。在消息协定中,可以指定消息的哪些部分要放在SOAP标题中,哪些部分要放在SOAP正文中。SOAP消息的标题和正文用MessageHeader和MessageBodyMember属性指定。指定Position属性,可以确定正文中的元素顺序,还可以为标题和正文字段指定保护级别。

消息协定可以与服务接口中的操作协定一起使用最为操作协定函数的参数。

3.5错误协定

默认情况下,在服务中出现的详细异常消息不返回客户端程序。其原因是安全性。不应该详细的异常消息提供给使用服务的第三方。而异常应记录到服务上(为此可以使用跟踪和事件日志功能),包含有用细心的错误应返回调用者。

可以抛出一个FaultException异常,来返回SOAP错误。抛出FaultException异常会创建一个非类型化的SOAP错误。返回错误的首选方式是生成强类型化的SOAP错误。

应与强类型化的SOAP错误一起传递的信息用数据协定定义,如下面的StateFault类所示

SOAP错误类型FaultContract属性和操作协定:

在现实代码中,抛出一个FaultException<TDetail>异常。在构造函数中,可以指定一个新的TDetail对象,在本例中就是StateFault。另外,FaultReason中的错误信息可以赋予构造函数。FaultReason支持多种语言的错误信息。

在客户端应用程序中,可以捕获FaultException<TDetail>类型的异常。出现该异常的原因由Message属性定义。

除了捕获强类型化的SOAP错误之外,客户短应用程序还可以捕获FaultException<TDetail>的基类型的异常:FaultException异常和Communication异常。捕获Communication异常还可以捕获与WCF通信相关的其它异常。


猜你喜欢

转载自blog.csdn.net/wudong121/article/details/80474875
WCF