DotNet关键知识点——WCF篇(一)

来源:互联网 发布:杭州派购网络 编辑:程序博客网 时间:2024/05/17 09:09

本章介绍WCF的基础概念。
WCF是.NET 3.0之后主推的程序间的业务导向(Service Oriented)的通信基础架构。
WCF相关的通信协议参考:
SOAP 1.2 spec: http://www.w3.org/TR/soap/
WSDL 1.1 spec: http://www.w3.org/TR/wsdl
XML Schema primer: http://www.w3.org/TR/xmlschema-0/


WCF业务主要由以下三部分组成:
服务(Service类) 描述和实现提供的服务,由服务约定(Contract,S/C两侧约定的接口)接口继承
主机(Host)          用于开展业务的基础
端点(endpoint)   供客户连接服务的接入点。端点通常表现为ABC,即地址(Address,如URI),绑定模式(Binding,描述协议和安全性等)以及服务约定

约定Contract是WCF业务开展的关键,约定主要包括三类,在以下三节介绍。

1. 服务约定(Service Contract)

定义服务的行为。

服务约定接口上加ServiceContractAttribute标记
在接口的方法中加OperationContractAttribute标记

消息交互模式说明实现命令/响应
Request/Response
总有一个返回消息(如果是void类型则是一个空SOAP体消息)OperationContractAttribute.IsOneWay采用默认的false
且不作Duplex通道设置单向
OneWay
不返回消息,也无法返回错误,因此不在有这些需求的场合下使用。
使用消息队列时总采用OneWay模式OperationContractAttribute.IsOneWay=true双工
Duplex
等待返回消息;
可能有服务端发来的独立消息。
注意:
安全问题;
要求会话(Session)维护,而SO希望无状态模式;
互通性丧失,因为返回通道(Callback Channel)由WCF维护;
如果两侧传递不采用单向通信(IsOneWay=true)会导致线程问题。
定义一个服务约定接口(加ServiceContract(CallbackContract=IxxxHandler)),一个返回消息服务约定接口IxxxHandler,而其方法OperationContractAttribute.IsOneWay=true建立Session,用ServiceBehaviorAttribute修饰服务约定实现类,并相应设置其参数(如InstanceContextMode=PerSession);在服务约定实现动作中调OperationContext.Current.GetCallbackChannel()打开通道获得接口IxxxHandler,并调其方法完成消息返回。


参数类型命名
用[(return:) MessageParameter(Name=…)] 标记,指定相应类型在WSDL中出现的名称

出错处理(Fault)
在约定接口相应方法上加FaultContractAttribute(typeof(内嵌类型))标记,在出错处抛出FaultException<内嵌类型>(内嵌类型 p)。也可用不带类型的FaultException。

2. 数据约定(Data Contract)

用于定义较复杂的参数和返回值类型,以指导数据的序列化。用DataContractAttribute修饰对应的类型(struct, class和enum等)。在默认情况下这个标记存在于相关类型上。
采用数据约定的数据均在SOAP消息的消息体(body)中传送,对应动作名(operation name)、参数名等均用相应的包裹体现。
在数据结构的成员上用DataMemberAttribute修饰:
IsRequired属性用于进行版本控制;
Order属性指定顺序(首先是基类成员,其次是未赋Order的成员以字母顺序,再次是赋Order的按指定顺序);
EmitDefaultValue属性指定是否发送采用默认值的项,默认为true。
在枚举体成员上用EnumMemberAttribute修饰。
在数据约定中,只有被上述两个成员标记修饰的成员才在数据序列化中被考虑。

集合
1. 一个具体的实现IEnumerable/IEnumerable和Add方法的可序列化类型(标记SerializableAttribute),(通过服务的元数据)在客户端转换成对应类型的数组。
2. 在自定义集合类型之前使用CollectionDataContractAttribute,Name属性置为"XXX{0}",这样在客户端将对应转换成XXXT,其中T是集合元素泛型实参。

继承
在基类上加KnownTypeAttribute,以允许的派生类的类型(typeof(…))作为参数。

3. 消息约定(Message Contract)

用于详细指定数据在SOAP中的传递方式,以及自定消息头。
消息约定必须同时作用到一个动作的参数和返回值上,或者完全不使用。
用MessageContractAttribute修饰对应的类型,其属性主要包括:
IsWrapped属性用于在SOAP中对数据内容进行包裹(用WrapperName属性指定的名字或类型本身名称,以及WrapperNameSpace属性指定的名空间),WCF默认IsWrapped为false,而通常其他平台的处理是进行包裹的。
ProtectionLevel属性用于指定消息传输的安全特性。

具体成员可位于消息头和消息体分别用一下标记指定:
MessageHeaderAttribute
ProtectionLevel属性用于指定安全特性,Actor是一个URI,用于指定消息的目标,默认为当前服务,MustUnderstand用于指定目标是否必须能够处理该消息,Relay用于指定在无法处理的情况下消息是否能够传递到下一个接收者。

MessageBodyAttribute

Name用于为项目起名,Namespace用于指定一个名空间,ProtectionLevelOrder同上。
原创粉丝点击