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

WCF 服務中繼資料位址詳解:WSHttpBinding 與 NetTcpBinding 實戰

     編輯:關於.NET

前言

初學 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);
}

一、 WSHttpBinding:HTTP 基址即中繼資料位址

服務啟動程式碼

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。無論端點相對路徑如何設定,中繼資料位址固定為基址。

二、 NetTcpBinding:需顯式新增 MEX 端點

服務啟動程式碼

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 位址,避免探索失敗。

三、 核心差異總結

繫結中繼資料位址關鍵配置
WSHttpBindingHTTP 基址(如 https://host:port/Path)HttpGetEnabled=true
NetTcpBindingTCP 基址 + MEX 相對路徑(如 net.tcp://host:port/Path/mex)新增 IMetadataExchange 端點,繫結 MexTcpBinding

結語

中繼資料位址屬於 ServiceHost 層級,而非端點層級。WSHttpBinding 借助 HTTP GET 機制簡單直觀;NetTcpBinding 需顯式發布 MEX 端點。熟練掌握這兩種模式,是 WCF 服務部署與客戶端產生的基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved