WCF第一要素就是契约:

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

[ServiceContract]
Public interface Iservice
{
 
}

接口调用契约的好处:

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

2.       有利于版本升级

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

服务契约的属性与作用:

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

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

SessionMode服务契约的会话方式,允许的值有Allowed、NotAllowed和Required。默认为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>