自学WCF理论知识
1.理论知识
WCF中,契约可分为
1.1 用于定义服务操作的服务WCF契约:Service Contract
这种级别的契约又包括两种:ServiceContract和OperationContract
ServiceContract用于类或者结构上,用于WCF此类或者结构能被远程调用
OperationContract 用于类中的方法(Method)上,用于指示WCF该方法可被远程调用。
1.11 ServiceContract属性值可以设置
Name:给契约定义一个名称,而不是使用接口或是类的类型名,在客户端添加服务引用时用到
Namespace:命名空间
CallbackContract:将另一个服务契约定义为回调契约,使得客服端可以接收服务端的异步消息。
ProtectionLevel:控制契约中发送消息的保护模式是否需要被签名和加密。该属性为System.Net.Security.ProtectionLevel枚举类型。
SessioMode:确定会话是否为公开服务契约的端点所支持。
1.12 ConfigurationName:服务的配置名称。
OperationContract属性值设置
Name:定义一个操作名称,而不是使用方法名称、
Action:该操作消息的动作标题
ReplyAction:响应该操作消息的动作标题
IsOneWay:设置该操作是否单向和没有回复,如果操作是单向的,将不支持ReplyAction。
ProtectionLevel:允许你控制特定的操作消息是否被保护,操作中的ProtectionLevel属性将覆盖服务契约中的ProtectionLevel。该属性为System.Net.Security.ProtectionLevel枚举类型。
IsInitiating:操作是否可以用来初始化会话。
IsTerminating:操作是否中止一个会话。
AsyncPattern:将服务操作定义为异步实现模式。
1.2 用于自定义结构的数据Wcf契约:Data Contract
数据契约也可分为两种:DataContract和DataMember用于类或者结构上,指示 WCF此类或者结构能够被序列化并传输,而DataMember只能用在类或者结构的属性(Property)或者字段(Field)上,指示WCF该属性或者字段能够被序列化传输。
使用数据契约必须引用System.Runtime.Serialization命名空间,在类型上使用DataContractAttribute可以创建数据契约,类型中的成员使用DataMember标记。代码如下:
1.21 DataContract属性值
IsReferece:bool类型,表示进行序列化的时候是否保持对象现有的引用结构
Name:名称。
Namespace:命名空间。
1.22 DataMember
EmitDefaultValue:表明在数据成员的值等于默认值的情况下,是否还须要将其序列化到最终的XML中,默认值为true,表示默认值会参与序列化。
IsRequired:bool类型,表明属性成员是否是必须的成员,默认值为false。
Name:数据成员的别名。
Order:相应的数据成员在最终序列化的XML中出现的位置,默认是按字母顺序排列的。
1.3 用于自定义错误异常的WCF契约:Fault Contract
FaultContract用于自定义错误异常的处理方式,默认情况下,当服务端抛出异常的时候,客户端能接收到异常信息的描述,但这些描述往往格式统一,有时比较难以从中获取有用的信息,此时,我们可以自定义异常消息的格式,将我们关心的消息放到错误消息中传递给客户端,此时需要在方法上添加自定义一个错误消息的类,然后在要处理异常的函数上加上FaultContract,并将异常信息指示返回为自定义格式。
IService1.cs中代码:
[OperationContract] //定义为操作契约 [FaultContract(typeof(Exception))] //定义为错误契约 int sum(int i,int j);
Service1.svc中代码:
//实现接口层中写入的方法签名 public int sum(int i, int j) { if (j == 0) { Exception er = new Exception(); throw new FaultException<Exception>(er, "除数不能为0"); } else { return i / j; } }
Web应用程序中的代码:
protected void Page_Load(object sender, EventArgs e) { try { Service1Client Server1 = new Service1Client(); Response.Write(Server1.sum(0,0)); //这里设置的为能引发异常的参数 } catch (Exception ex) { Response.Write(ex.Message); //输出异常信息,输出“除数不能为零” } }
1.4用于控制消息格式的消息WCF契约:Message Contract
简单的说,它能自定义消息格式,包括消息头,消息体,还能指示是否对消息内容进行加密和签名。
使用消息契约必须引用System.ServiceModel命名空间,消息契约和数据契约一样都是定义在数据类型上。和数据契约不同的是消息契约更多的是关注数据成员在SOAP消息中的表示。定义一个消息契约需要用到MessageContract特性,另外还涉及到MessageHeader和MessageBodyMember这两个特性,MessageContractAttribute特性标记在类型上,MessageHeader和MessageBodyMember特性标记在数据成员上。
2.host app.config 的简单配置多个调用