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

WCF 系列(一)純程式碼建置 WCF 服務與用戶端完整指南

     編輯:關於.NET

前言

WCF 的核心架構為「ABC」:Address (位址)、Binding (繫結)、Contract (合約)。本文示範完全不使用設定檔,僅以程式碼建置服務端與用戶端,幫助開發者深入理解 WCF 運行機制。注意:此方式不適用於 IIS 裝載 (IIS 必須使用 Web.config)。

一、服務端實作

1.1 定義服務合約與實作


[ServiceContract]
public interface IService
{
    [OperationContract]
    string MyOperation1(string myValue);
}

public class Service : IService
{
    public string MyOperation1(string myValue)
    {
        return "Hello: " + myValue;
    }
}

1.2 建立 ServiceHost


Uri baseAddress = new Uri("https://localhost:8080/WCFService/Service");
ServiceHost host = new ServiceHost(typeof(Service), baseAddress);

ServiceHost 建構子接受服務型別與一或多個基底位址。一個 ServiceHost 僅能裝載一個服務類別,但該類別可實作多個合約,每個合約可暴露多個端點 (不同繫結)。

1.3 應用程式域與 ServiceHost

.NET 引入應用程式域 作為隔離邊界:比進程輕量、比執行緒安全。CLR 載入可執行檔後,建立預設應用程式域,再建立新域載入使用者程式碼。ServiceHost 即運行於某個應用程式域內。一個進程可包含多個應用程式域,一個域可包含多個 ServiceHost 實例,但建議每域僅一個以利管理。

CLR 載入流程

ServiceHost 在應用程式域中

1.4 新增端點 (兩種方式)

方式一:ServiceHost.AddServiceEndpoint


// 最常用的多載:合約型別、繫結、相對位址 (空字串表示使用 baseAddress)
host.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "");

AddServiceEndpoint 共有 8 種多載,分別接受 Type 或 string 形式的合約、string 或 Uri 形式的位址,並可選擇性指定 listenUri。

方式二:透過 ServiceDescription 建立 ServiceEndpoint


ContractDescription cd = ContractDescription.GetContract(typeof(IService));
ServiceEndpoint endpoint = new ServiceEndpoint(cd, new BasicHttpBinding(), new EndpointAddress(baseAddress));
host.Description.Endpoints.Add(endpoint);

此方式更接近 WCF 內部模型,ServiceDescription 為服務在記憶體中的完整描述。

1.5 新增行為:啟用中繼資料發布


ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.HttpGetUrl = new Uri("https://localhost:8001/");
host.Description.Behaviors.Add(behavior);

發布中繼資料需具備 HTTP 基底位址,故建構 ServiceHost 時必須包含 HTTP 的 baseAddress。

1.6 開啟服務


host.Open();
Console.WriteLine("服務已啟動,按 Enter 結束...");
Console.ReadLine();
host.Close();

二、用戶端實作

2.1 取得服務合約 (三種方式)

  1. 直接複製合約程式碼:最原始,但難以維護一致性。
  2. 使用 Svcutil.exe:
    Svcutil.exe https://localhost:8080/WCFService/Service
    
    產生兩個檔案:Proxy 程式碼 (.cs) 與設定檔 (.config)。
  3. Visual Studio「加入服務參考」:與 Svcutil.exe 效果相同,產生 Proxy 類別與設定檔。
    加入服務參考

2.2 建立 Proxy 實例 (不使用設定檔)

將產生的設定檔從專案中排除,僅保留 Proxy 程式碼。

方式一:ChannelFactory<T> 泛型


IService proxy = ChannelFactory<IService>.CreateChannel(
    new BasicHttpBinding(),
    new EndpointAddress("https://localhost:8080/WCFService/Service")
);

包含 ABC 三要素:EndpointAddress (A)、BasicHttpBinding (B)、IService (C)。

方式二:直接使用產生的 Proxy 類別


ServiceClient proxy = new ServiceClient(
    new BasicHttpBinding(),
    new EndpointAddress("https://localhost:8080/WCFService/Service")
);

ServiceClient 繼承 ClientBase<IService>,本身即綁定特定合約。

2.3 呼叫服務


string result = proxy.MyOperation1("myFirstWCF");
Console.WriteLine(result); // Hello: myFirstWCF

三、關鍵概念總結

概念說明
ServiceHost服務裝載容器,管理端點、行為、生命週期
Endpoint (ABC)Address (哪裡)、Binding (怎麼通訊)、Contract (做什麼)
Binding決定傳輸協定、編碼、安全性、可靠傳訊、交易流等
ContractDescription合約在記憶體中的描述,含作業、訊息、錯誤合約
ChannelFactory建立通道的工廠,用戶端發起呼叫的核心
ServiceMetadataBehavior控制 WSDL/WS-MetadataExchange 發布

結語

純程式碼建置雖不適合生產部署,但能幫助開發者建立清晰的 WCF 內部運作心智模型。下一篇將介紹如何使用設定檔簡化部署與維護。

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