WCF 的核心架構為「ABC」:Address (位址)、Binding (繫結)、Contract (合約)。本文示範完全不使用設定檔,僅以程式碼建置服務端與用戶端,幫助開發者深入理解 WCF 運行機制。注意:此方式不適用於 IIS 裝載 (IIS 必須使用 Web.config)。
[ServiceContract]
public interface IService
{
[OperationContract]
string MyOperation1(string myValue);
}
public class Service : IService
{
public string MyOperation1(string myValue)
{
return "Hello: " + myValue;
}
}
Uri baseAddress = new Uri("https://localhost:8080/WCFService/Service");
ServiceHost host = new ServiceHost(typeof(Service), baseAddress);
ServiceHost 建構子接受服務型別與一或多個基底位址。一個 ServiceHost 僅能裝載一個服務類別,但該類別可實作多個合約,每個合約可暴露多個端點 (不同繫結)。
.NET 引入應用程式域 作為隔離邊界:比進程輕量、比執行緒安全。CLR 載入可執行檔後,建立預設應用程式域,再建立新域載入使用者程式碼。ServiceHost 即運行於某個應用程式域內。一個進程可包含多個應用程式域,一個域可包含多個 ServiceHost 實例,但建議每域僅一個以利管理。


// 最常用的多載:合約型別、繫結、相對位址 (空字串表示使用 baseAddress)
host.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "");
AddServiceEndpoint 共有 8 種多載,分別接受 Type 或 string 形式的合約、string 或 Uri 形式的位址,並可選擇性指定 listenUri。
ContractDescription cd = ContractDescription.GetContract(typeof(IService));
ServiceEndpoint endpoint = new ServiceEndpoint(cd, new BasicHttpBinding(), new EndpointAddress(baseAddress));
host.Description.Endpoints.Add(endpoint);
此方式更接近 WCF 內部模型,ServiceDescription 為服務在記憶體中的完整描述。
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.HttpGetUrl = new Uri("https://localhost:8001/");
host.Description.Behaviors.Add(behavior);
發布中繼資料需具備 HTTP 基底位址,故建構 ServiceHost 時必須包含 HTTP 的 baseAddress。
host.Open();
Console.WriteLine("服務已啟動,按 Enter 結束...");
Console.ReadLine();
host.Close();
Svcutil.exe https://localhost:8080/WCFService/Service
產生兩個檔案:Proxy 程式碼 (.cs) 與設定檔 (.config)。Svcutil.exe 效果相同,產生 Proxy 類別與設定檔。
將產生的設定檔從專案中排除,僅保留 Proxy 程式碼。
IService proxy = ChannelFactory<IService>.CreateChannel(
new BasicHttpBinding(),
new EndpointAddress("https://localhost:8080/WCFService/Service")
);
包含 ABC 三要素:EndpointAddress (A)、BasicHttpBinding (B)、IService (C)。
ServiceClient proxy = new ServiceClient(
new BasicHttpBinding(),
new EndpointAddress("https://localhost:8080/WCFService/Service")
);
ServiceClient 繼承 ClientBase<IService>,本身即綁定特定合約。
string result = proxy.MyOperation1("myFirstWCF");
Console.WriteLine(result); // Hello: myFirstWCF
| 概念 | 說明 |
|---|---|
| ServiceHost | 服務裝載容器,管理端點、行為、生命週期 |
| Endpoint (ABC) | Address (哪裡)、Binding (怎麼通訊)、Contract (做什麼) |
| Binding | 決定傳輸協定、編碼、安全性、可靠傳訊、交易流等 |
| ContractDescription | 合約在記憶體中的描述,含作業、訊息、錯誤合約 |
| ChannelFactory | 建立通道的工廠,用戶端發起呼叫的核心 |
| ServiceMetadataBehavior | 控制 WSDL/WS-MetadataExchange 發布 |
純程式碼建置雖不適合生產部署,但能幫助開發者建立清晰的 WCF 內部運作心智模型。下一篇將介紹如何使用設定檔簡化部署與維護。