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

WCF 技術深度剖析(一):以 ASP.NET 模擬 WCF 基礎架構核心流程

     編輯:關於.NET

前言:用熟悉的 ASP.NET 拆解 WCF 黑盒

WCF 架構龐大,組件眾多。與其死記組件名稱,不如親手用 ASP.NET 搭建一個迷你 WCF 框架,體驗訊息編碼、序列化、調度、調用的完整流程。本文將引導你從零實作 Client/Server 核心管道,深度理解 WCF 內部運作。

一、WCF 服務端/客戶端核心組件對照

階段服務端組件客戶端組件
傳輸收發Channel Stack (Listener)Channel Stack (Request/Reply)
編碼/解碼MessageEncoder / MessageEncoderFactoryMessageEncoder / MessageEncoderFactory
序列化/反序列化IDispatchMessageFormatterIClientMessageFormatter
實例管理IInstanceProvider—
操作調用IOperationInvoker—

二、方案結構

  • Contracts:共用服務契約 ICalculator (Class Library)。
  • Server:ASP.NET Web Site,Calculator.aspx 模擬服務端管道。
  • Client:Console App,自訂 RealProxy 模擬代理調用。

三、核心組件建立:Utility.Create<T> 反射實例化內部類型

WCF 內部組件 (TextMessageEncoderFactory、DataContractSerializerOperationFormatter、SyncMethodInvoker) 皆為 internal,必須用反射建立:

public static void Create<T>(
    out MessageEncoderFactory encoderFactory,
    out IDictionary<string, IClientMessageFormatter> clientFormatters,
    out IDictionary<string, IDispatchMessageFormatter> dispatchFormatters,
    out IDictionary<string, IOperationInvoker> operationInvokers,
    out IDictionary<string, MethodInfo> methods)
{
    // 1. 驗證 ServiceContractAttribute
    // 2. 反射建立 TextMessageEncoderFactory
    // 3. 解析 OperationContractAttribute 取得 Action、Name
    // 4. 反射建立 DataContractSerializerOperationFormatter (雙介面)
    // 5. 反射建立 SyncMethodInvoker
    // 6. 填入字典:Key = OperationName (Formatter) / Action (Invoker/MethodInfo)
}

四、服務端:Calculator.aspx 手工處理請求

protected void Page_Load(object sender, EventArgs e)
{
    // 1. Encoder.ReadMessage(Request.InputStream) → Request Message
    // 2. Request.Headers.Action → 找到 MethodInfo
    // 3. DispatchFormatter.DeserializeRequest → 參數陣列
    // 4. Activator.CreateInstance(ServiceType) → 服務實例 (簡化版 InstanceProvider)
    // 5. OperationInvoker.Invoke(instance, params, out outParams) → 執行操作
    // 6. DispatchFormatter.SerializeReply → Reply Message
    // 7. Encoder.WriteMessage(Reply, Response.OutputStream) → 回應客戶端
}

五、客戶端:ServiceRealProxy 攔截介面調用

  • 繼承 RealProxy,覆寫 Invoke(IMessage)。
  • 解析 IMethodCallMessage 取得方法名、參數。
  • ClientFormatter.SerializeRequest → Request Message。
  • 加上 WS-Addressing Headers (MessageId, ReplyTo, To)。
  • Encoder.WriteMessage → 位元組陣列 → HttpWebRequest.Post 發送。
  • 接收 HttpWebResponse → Encoder.ReadMessage → Reply Message。
  • ClientFormatter.DeserializeReply → 返回值 + ref/out 參數映射回 ReturnMessage。

六、工廠與測試

// Client 程式
var calculator = ServiceProxyFactory<ICalculator>.Create(
    MessageVersion.Default, 
    new Uri("https://localhost/.../Calculator.aspx"));
double result = calculator.Add(1, 2); // 輸出: 3

七、收穫與啟發

  1. 訊息是核心:WCF 內部一切圍繞 Message 流轉,編碼/序列化/調度皆為訊息轉換。
  2. 分層解耦:傳輸、編碼、序列化、調度、實例管理、調用各司其職,可替換擴展。
  3. 反射驅動:契約屬性 (Attribute) 為元數據來源,運行時反射構建執行圖。
  4. 擴展點清晰:IInstanceProvider、IOperationInvoker、MessageFormatter、MessageEncoder 皆可自訂替換。

親手搭建迷你框架,WCF 不再是黑盒,而是清晰可控的管道組合。

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