本文系統闡述 WCF 四大契約類型(服務、資料、錯誤、訊息)的定義、用途、聲明式程式設計模式、跨平台獨立性、與 ASMX Web Service 的異同。適合 WCF 初學者建立契約核心觀念。
| 契約類型 | 核心屬性 | 適用目標 | 核心功能 |
|---|---|---|---|
| 服務契約 | [ServiceContract], [OperationContract] |
介面/類別/結構、方法 | 定義服務公開操作簽名,可被遠端呼叫 |
| 資料契約 | [DataContract], [DataMember] |
類別/結構、屬性/欄位 | 定義可序列化傳輸的資料結構 (XSD) |
| 錯誤契約 | [FaultContract] |
方法 | 定義 SOAP Fault 詳細錯誤資訊結構 |
| 訊息契約 | [MessageContract], [MessageHeader], [MessageBodyMember] |
類別/結構、屬性 | 完全控制 SOAP 訊息結構 (Header/Body/加密/簽名) |
[ServiceContract]
public interface IUserService {
[OperationContract]
UserDto GetUser(int id);
[OperationContract]
[FaultContract(typeof(UserNotFoundFault))]
UserDto GetUserWithFault(int id);
}
[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; }
}
[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("查無此用戶")
);
[MessageContract]
public class CustomRequest {
[MessageHeader] public string CorrelationId { get; set; }
[MessageHeader] public string SecurityToken { get; set; }
[MessageBodyMember] public UserDto Payload { get; set; }
}
WCF 契約獨立於平台、語言、作業系統:
| 維度 | ASMX Web Service | WCF | WCF 優勢 |
|---|---|---|---|
| 聲明式屬性 | [WebService], [WebMethod] |
[ServiceContract], [OperationContract] |
語法相似,遷移平滑 |
| 介面導向 | 不支援 (僅類別) | 原生支援介面 | 實作與契約分離,支援多實現、版本共存 |
| 契約豐富度 | 僅操作+簡單資料 | 四大契約體系 | 錯誤契約標準化、訊息契約完全控制 |
| 序列化引擎 | XmlSerializer | DataContractSerializer (預設) | 效能更好、支援版本容忍、循環引用 |
| 託管靈活性 | 僅 IIS | 自我宿主、IIS、WAS、Windows Service、Com+ | 部署場景無限制 |