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>
?