自学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 的简单配置多个调用

     

 

posted @ 2016-03-15 12:15  奋斗生活只为优质人生。  阅读(282)  评论(0编辑  收藏  举报