说起Contracts,我们大家都能想到它的中文意思,没错,“合同,契约”。那我们搬出它来做什么呢?WCF是一种技术架构,支持跨平台,跨语言,跨域等多种复杂环境。这种情况就不得不要求我们做出一种规范,来实现上述目的。而这种规范就是所谓的“契约”。
我们先说说契约的种类:ServiceContract, DataConstract, FaultContract, MessageContract.
下面分别介绍一下各个契约的含义以及如何使用:
ServiceContract即所谓的“服务契约”,它是用来定义一系列服务的操作的契约。通常被用在Interface上。该接口中定义了一系列可供客户端调用的方法,在这些方法上我们还需要声明为“OperationContract”. 这就代表,该方法是可以被客户端调用到的。OperationContract可以声明在interface中的方法上,也可以声明在Class的方法上,但该class必须继承于声明为ServiceContract的interface.如:
[ServiceContract]
interface IService
{
[OperationContract]
SqlResult<People> GetPeople(string ID);
[OperationContract]
void NotifyPeople(string ID);
}
DataContract即“数据契约”,是用来定义客户端与WCF服务之间进行数据交换的数据格式。datacontract中定义了需要交换的数据都有哪些,但也不是说datacontract中定义的property就全部是需要交换的数据,只有被声明为DataMemeber的property才会被认为是需要交换的数据。如:
[DataContract]
public class People
{
[DataMemeber]
public string Name
{
get;
set;
}
[DataMemeber]
public string Sex
{
get;
set;
}
//没有标示DataMemeber Attribute,所以此property不会被serilized到jsonstring中
public sring Temp
{
get;
set;
}
}
FaultContract即“错误契约”,是用来定义当WCF服务中执行的操作出现异常时抛出的错误信息处理方式,FaultContract通常定义在服务契约中声明的方法上面,一般和OperationContact一起使用,来说明当此方法中抛出异常时所传会客户端的信息格式。如:
[ServiceContract]
interface IService
{
[OperationContract]
[FaultContract(typeof(ApplicationException))]
string something(int a);
}
Message Contract即“消息契约”,可以用来定义客户端与WCF服务之间进行消息传递时所使用的信息格式,包括消息头和消息体,还可以指示是否对消息进行加密。如:
[MessageContract]
public class PatientRecord
{
[MessageHeader(ProtectionLevel=None)] public int recordID;
[MessageHeader(ProtectionLevel=Sign)] public string patientName;
[MessageHeader(ProtectionLevel=EncryptAndSign)] public string SSN;
[MessageBodyMember(ProtectionLevel=None)] public string comments;
[MessageBodyMember(ProtectionLevel=Sign)] public string diagnosis;
[MessageBodyMember(ProtectionLevel=EncryptAndSign)] public string medicalHistory;
}
通过以上的介绍,其实ServiceContract与OperationContract标记就像是WebService中的WebService和WebMethod标记,
[WebService]
public class PeopleInfo
{
[WebMethod]
public SqlResult<People> GetPeopleInfo(string ID)
{
//..
}
}
大家可以对比一下:
[ServiceContract]
interface IPeople
{
[OperationContract]
SqlResult<People> GetPeopleInfo(string ID);
}