初學 WCF 最常見的困惑:svcutil.exe 或「加入服務參考」時,該填寫什麼 URL?本文以兩種最常用繫結為例,實地演示服務基址與中繼資料端點的對應關係。
[ServiceContract]
public interface ICalculatorService
{
[OperationContract] double Add(double n1, double n2);
[OperationContract] double Subtract(double n1, double n2);
[OperationContract] double Multiply(double n1, double n2);
[OperationContract] double Divide(double n1, double n2);
}
Uri baseAddress = new Uri("https://localhost:8009/MyService");
ServiceHost host = new ServiceHost(typeof(CalculatorService), baseAddress);
// 啟用 HTTP GET 取得中繼資料
ServiceMetadataBehavior smb = new ServiceMetadataBehavior { HttpGetEnabled = true };
host.Description.Behaviors.Add(smb);
// 服務端點
host.AddServiceEndpoint(typeof(ICalculatorService), new WSHttpBinding(), baseAddress);
host.Open();
關鍵點:baseAddress 同時是服務端點位址與中繼資料位址。HttpGetEnabled=true 讓 WCF 自動在基址公開中繼資料。
svcutil https://localhost:8009/MyService /language:cs /out:Proxy.cs /config:app.config
或在 VS「加入服務參考」位址欄輸入 https://localhost:8009/MyService。無論端點相對路徑如何設定,中繼資料位址固定為基址。
Uri baseAddress = new Uri("net.tcp://localhost:8009/MyService");
ServiceHost host = new ServiceHost(typeof(CalculatorService), baseAddress);
// 不啟用 HttpGetEnabled(無 HTTP 基址會拋例外)
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
host.Description.Behaviors.Add(smb);
// 關鍵:新增 MEX 端點
host.AddServiceEndpoint(typeof(IMetadataExchange),
MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
// 服務端點
host.AddServiceEndpoint(typeof(ICalculatorService), new NetTcpBinding(), baseAddress);
host.Open();
完整位址:net.tcp://localhost:8009/MyService/mex(基址 + MEX 端點相對路徑)。
若 MEX 端點相對路徑命名為 "mex",svcutil 也可僅輸入基址自動探索:
svcutil net.tcp://localhost:8009/MyService/mex /language:cs /out:Proxy.cs /config:app.config
建議:始終使用完整 MEX 位址,避免探索失敗。
| 繫結 | 中繼資料位址 | 關鍵配置 |
|---|---|---|
| WSHttpBinding | HTTP 基址(如 https://host:port/Path) | HttpGetEnabled=true |
| NetTcpBinding | TCP 基址 + MEX 相對路徑(如 net.tcp://host:port/Path/mex) | 新增 IMetadataExchange 端點,繫結 MexTcpBinding |
中繼資料位址屬於 ServiceHost 層級,而非端點層級。WSHttpBinding 借助 HTTP GET 機制簡單直觀;NetTcpBinding 需顯式發布 MEX 端點。熟練掌握這兩種模式,是 WCF 服務部署與客戶端產生的基本功。