首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 從理論到實踐 (3):契約全解析——服務、資料、錯誤、訊息四大合約

     編輯:關於.NET

文章導讀

本文系統闡述 WCF 四大契約類型(服務、資料、錯誤、訊息)的定義、用途、聲明式程式設計模式、跨平台獨立性、與 ASMX Web Service 的異同。適合 WCF 初學者建立契約核心觀念。

核心知識點

  • 四大契約類型定義與屬性對應表
  • 聲明式程式設計:屬性標註即完成契約定義
  • 契約跨平台獨立性:只約束規則,不綁定技術棧
  • 與 ASMX Web Service 異同:介面導向、版本共存優勢

一、WCF 四大契約總覽

契約類型核心屬性適用目標核心功能
服務契約 [ServiceContract], [OperationContract] 介面/類別/結構、方法 定義服務公開操作簽名,可被遠端呼叫
資料契約 [DataContract], [DataMember] 類別/結構、屬性/欄位 定義可序列化傳輸的資料結構 (XSD)
錯誤契約 [FaultContract] 方法 定義 SOAP Fault 詳細錯誤資訊結構
訊息契約 [MessageContract], [MessageHeader], [MessageBodyMember] 類別/結構、屬性 完全控制 SOAP 訊息結構 (Header/Body/加密/簽名)

二、契約定義實戰範例

1. 服務契約

[ServiceContract]
public interface IUserService {
    [OperationContract]
    UserDto GetUser(int id);

    [OperationContract]
    [FaultContract(typeof(UserNotFoundFault))]
    UserDto GetUserWithFault(int id);
}

2. 資料契約

[DataContract]
public class UserDto {
    [DataMember] public int Id { get; set; }
    [DataMember] public string Name { get; set; }
    [DataMember] public string Email { get; set; }
    // 無 DataMember 的欄位不會序列化
    public string InternalNote { get; set; }
}

3. 錯誤契約

[DataContract]
public class UserNotFoundFault {
    [DataMember] public int UserId { get; set; }
    [DataMember] public string Message { get; set; }
    [DataMember] public DateTime Timestamp { get; set; }
}

// 服務端拋出
throw new FaultException<UserNotFoundFault>(
    new UserNotFoundFault { UserId = id, Message = "用戶不存在", Timestamp = DateTime.Now },
    new FaultReason("查無此用戶")
);

4. 訊息契約

[MessageContract]
public class CustomRequest {
    [MessageHeader] public string CorrelationId { get; set; }
    [MessageHeader] public string SecurityToken { get; set; }
    [MessageBodyMember] public UserDto Payload { get; set; }
}

三、契約的跨平台獨立性

WCF 契約獨立於平台、語言、作業系統:

  • 本質是 XSD/WSDL/WS-Policy 等開放標準
  • 只約束「通訊雙方必須遵守的規則」
  • 不關心雙方實現技術 (C#/Java/Go) 或 OS (Windows/Linux)
  • 這是 WCF 作為 SOA 基礎設施的生命力所在

四、契約與 ASMX Web Service 異同深度對比

維度ASMX Web ServiceWCFWCF 優勢
聲明式屬性 [WebService], [WebMethod] [ServiceContract], [OperationContract] 語法相似,遷移平滑
介面導向 不支援 (僅類別) 原生支援介面 實作與契約分離,支援多實現、版本共存
契約豐富度 僅操作+簡單資料 四大契約體系 錯誤契約標準化、訊息契約完全控制
序列化引擎 XmlSerializer DataContractSerializer (預設) 效能更好、支援版本容忍、循環引用
託管靈活性 僅 IIS 自我宿主、IIS、WAS、Windows Service、Com+ 部署場景無限制

五、參考資源

總結

  1. 契約是 WCF 通訊雙方的「法律條文」,四大類各司其職
  2. 聲明式屬性讓契約定義極簡單:標註即生效
  3. 跨平台獨立性源於開放標準,不綁定實現技術
  4. 介面導向設計是 WCF 相對 ASMX 最大進化,支援多版本並行、解耦實現
  5. 掌握四大契約,即掌握 WCF 服務設計的靈魂
本文配套源碼下載
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved