数据契约(DataContract)

WCF第一要素就是契约:

服务契约用于声明可用于远程访问的类型。在Interfaceclass开始处使用服务契约标签.

[ServiceContract]

Public interface Iservice

{

}

接口调用契约的好处:

1.       同一服务类型可以实现多个不相干的服务契约.

2.       有利于版本升级

3.       按照接口隔离原则,让开发人员可以随时修改服务契约.

服务契约的属性与作用:

Name/Namespace定义该服务契约的自定义名称和命名空间,它会反映到WSDL及客户端的导出类中

ConfigurationName设置信息在配置文件中的名称。默认情况下为类的全名(本例为“WCFDemo.IService”)。

SessionMode服务契约的会话方式,允许的值有AllowedNotAllowedRequired。默认为Allowed值。

CallbackContract设置双工通信时(Duplex)的回调类型。

ProtectionLevel指定消息保护模式,可以对通信的消息进行加密及签名。

使用参数时,例如要指定自定义的Name Namespace,可以编写如下的代码。

[ServiceContract(Name=”MyService”,Namespace=”http://microsoft.com/wcf/demo”)]

Interface IService{}

定义为服务契约的接口或类的方法可以被声明为OperationContract(操作契约),只有声明为操 作契约的方法才可以被远程调用

[ServiceContract]

Public interface Iservice

{

       [OperationContract]

       String SayHello(string name);

}

错误契约(FaultContract)

被标识为FaultContract的方法必须同时已经被声明为OperationContract,否则就没有什么意义。声明一个方法为 FaultContract并指定了响应的类型参数以后,当调用这个方法时产生错误时,就会有一个对应SOAP格式的错误消息返回给调用端

[DataContract]

public class UserFault //自定义错误类

{

        [DataMember]

        public string Message { get; set; }

        [DataMember]

        public int UserId { get; set; }

        public UserFault(int userId, string msg)

        {

            this.UserId = userId;

            this.Message = msg;

        }

}

  [ServiceContract]

  public interface IUserService

  {

        [OperationContract]

        [FaultContract(typeof(UserFault))]

        UserInfo GetUser(int id);

  }

  public UserInfo GetUser(int id)

  {

     try{

            UserInfo info = new UserInfo();

            info.Age = 16;

            info.UserName = "陈翔";

            return info;

        }

        catch (Exception e)

        {

            throw new FaultException<UserFault>(new UserFault(id, e.Message));

        }

  }

数据契约(DataContract)

[DataContract]

       public partial class Userinfo

       {    

              private string _xsid = String.Empty;

             

              /// <summary>

              /// 学生编号

              /// </summary>

              [DataMember(Name="xsid")]

              public string Xsid

              {

                     get { return _xsid; }

                     set { _xsid = value; }

              }

       }

服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。

一个类如果声明了DataContract类型,说明类是可以被传送的,且只有成员属性可以被传送.支持Name/Namespace属性[DataContract(Name=”Name”)]

每一个要传送的成员声明为DataMember类型,同样也可以包含Name,Namespace,IsRequired,Order,EmitDefaultvalue属性

需要传送SOAP消息时可以使用[MessageContract] eg:

[MessageContract]

       public partial class Userinfo

       {    

              private string _xsid = String.Empty;

              private string _njid = String.Empty;

              /// <summary>

              /// 学生编号

              /// </summary>

              [MessageBodyMember(

Name="xsid"

Namespace=”http://www.smodi.com”)]

              public string Xsid

              {

                     get { return _xsid; }

                     set { _xsid = value; }

              }

             

              /// <summary>

              /// 年级编号

              /// </summary>

              [MessageHeader(

Name="njid"

Namespace=”http://www.smodi.com”)]

              public string Njid

              {

                     get { return _njid; }

                     set { _njid = value; }

              }

       }

这个可以生成SOAP消息

<s:Envelope>

    <s:Header>

        <a:Action s:mustUnderstand="1">http:// Userinfo /Action</a:Action>

        <h:AuthKey s:mustUnderstand="1" xmlns:h="http://www.smodi.com">xxxx</h:AuthKey>

    </s:Header>

    <s:Body>

        <UserMessage xmlns="Microsoft.WCF.Documentation">

             <User xmlns="http://www.smodi.com">abcd</User>

       </UserMessage>

    </s:Body>   

</s:Envelope>

原文地址:https://www.cnblogs.com/chenqingwei/p/1754513.html