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

WCF 專題系列(五):深入尋址 Part 5 — 邏輯位址與實體位址分離應用

     編輯:關於.NET

兩種位址定義

  • 邏輯位址:SOAP 訊息 To 標頭目標位址,即 EndpointAddress
  • 實體位址:WCF 監聽器實際繫結的網路位址,即 ListenUri

未指定時兩者相同。程式碼驗證:

foreach (var se in host.Description.Endpoints)
    Console.WriteLine($"Logical: {se.Address} | Physical: {se.ListenUri}");

位址相同輸出

設定不同實體位址

程式碼方式

host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(),
    "urn:calcservice",          // 邏輯位址
    new Uri("https://localhost:8887/CalculatorService")); // 實體位址

組態檔方式

<endpoint address="urn:calcservice"
    binding="wsHttpBinding"
    contract="..."
    listenUri="https://localhost:8887/CalculatorService" />

運作原理:ClientViaBehavior 路由

WSDL 僅公開邏輯位址。客戶端需透過 ClientViaBehavior 指定實體位址發送訊息,但 SOAP To 標頭仍保持邏輯位址:

<endpointBehaviors>
  <behavior name="calculatorEndpointBehavior">
    <clientVia viaUri="https://localhost:8887/CalculatorService" />
  </behavior>
</endpointBehaviors>

SOAP To 標頭保持邏輯位址

訊息篩選器依 To 標頭(邏輯位址)比對 AddressFilter,實現路由轉發。

ListenUriMode 兩種模式

  • Explicit(預設):完全使用指定 ListenUri
  • Unique:傳輸機制確保唯一性
    • 非 TCP:附加 GUID
    • TCP 獨佔模式:繫結唯一可用埠
    • TCP 連接埠共享:附加 GUID

實戰:tcpTrace 訊息攔截兩種架構

架構一:客戶端配置 ClientViaBehavior

  • 服務:邏輯=實體=https://localhost:8887/CalculatorService
  • 客戶端:邏輯位址指向服務,clientVia 指向 tcpTrace (https://localhost:8080/CalculatorService)
  • tcpTrace 監聽 8080,轉發至 8887

tcpTrace 設定

攔截訊息

架構二:服務端分離位址,客戶端無感知

  • 服務:邏輯=https://localhost:8887/CalculatorService,實體=https://localhost:8080/CalculatorService
  • 客戶端:僅知邏輯位址
  • tcpTrace 監聽邏輯位址 (8887),轉發至實體位址 (8080)

架構二

總結

邏輯/實體位址分離是 WCF 路由、攔截、負載平衡的核心基礎,配合 ClientViaBehavior 與 ListenUri 靈活構建中介架構。

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