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

WCF 實戰 (5):SOA 與 OOP 融合 — Operation 多載在 WCF 中的契約映射實戰

     編輯:關於.NET

一、背景:Web Service 不支援多載

ASMX/Web Service 以 WSDL 描述,portType 中 Operation 以 name 屬性唯一識別。同名方法無法產生唯一 Operation Name,故不支援多載。

二、WCF 解決方案:OperationContract.Name 屬性

WCF 允許在 [OperationContract(Name="UniqueName")] 指定契約層面的唯一 Operation 名稱,實現 .NET 多載到 SOA 契約的映射。

三、完整範例:加法器多載 (兩數/三數相加)

專案結構 (3 專案:Service/Hosting/Client)

Solution 結構

1. 服務端 Contract 與實作

[ServiceContract]
public interface ICalculator
{
    [OperationContract(Name = "AddWithTwoOperands")] double Add(double x, double y);
    [OperationContract(Name = "AddWithThreeOperands")] double Add(double x, double y, double z);
}

public class CalculatorService : ICalculator
{
    public double Add(double x, double y) => x + y;
    public double Add(double x, double y, double z) => x + y + z;
}

2. Hosting 設定 (basicHttpBinding)

<endpoint binding="basicHttpBinding" contract="...ICalculator" />
<host><baseAddresses><add baseAddress="https://localhost:1234/calcuator" /></baseAddresses></host>

3. 驗證 WSDL 生成結果

瀏覽 ?wsdl 可見 portType 包含兩個唯一 Operation:

<wsdl:operation name="AddWithTwoOperands">...</wsdl:operation>
<wsdl:operation name="AddWithThreeOperands">...</wsdl:operation>

WSDL Operation 名稱

四、客戶端優雅呼叫:重寫 Contract 與 Proxy 還原多載

「添加服務參考」產生的 Proxy 為扁平化方法名 (AddWithTwoOperands, AddWithThreeOperands)。為還原多載體驗:

1. 客戶端自定義 Contract (含 Name 映射)

[ServiceContract(Name = "ICalculator")]
public interface IMyCalculator
{
    [OperationContract(Name = "AddWithTwoOperands")] double Add(double x, double y);
    [OperationContract(Name = "AddWithThreeOperands")] double Add(double x, double y, double z);
}

2. 客戶端自定義 Proxy 繼承 ClientBase

public class MyCalculatorClient : ClientBase<IMyCalculator>, IMyCalculator
{
    public double Add(double x, double y) => Channel.Add(x, y);
    public double Add(double x, double y, double z) => Channel.Add(x, y, z);
}

3. 設定端點對應自定義 Contract

<endpoint address="https://localhost:1234/calcuator"
          binding="basicHttpBinding"
          contract="...IMyCalculator" />

4. 雙 Proxy 對比驗證

// 產生式 Proxy
using (var gen = new CalculatorClient())
{
    gen.AddWithTwoOperands(1,2);
    gen.AddWithThreeOperands(1,2,3);
}

// 重構多載 Proxy
using (var my = new MyCalculatorClient())
{
    my.Add(1,2);       // 多載!
    my.Add(1,2,3);     // 多載!
}

雙 Proxy 執行結果一致

五、核心結論

  1. WCF 透過 OperationContract.Name 打通 .NET 多載與 SOA 唯一 Operation Name 的鴻溝。
  2. 服務端定義多載、指定 Name;客戶端同樣定義多載、指定相同 Name,即可實現端到端多載程式體驗。
  3. 此模式同樣適用於 泛型方法多載、參數陣列多載 等進階場景。

六、延伸閱讀

本系列後續文章將探討:服務端 Contract 繼承 (Part I/II)、雙工通訊、例外處理、Session/Instance 管理 等 WCF 核心進階主題。

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