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

WCF 實戰教學 (1):從 Hello World 起步 — 建立第一個 WCF 服務完整流程

     編輯:關於.NET

前言

所有框架學習的起點都是「Hello World」。本篇帶你從零建立一個最精簡的 WCF 服務,涵蓋契約定義、服務實作、IIS 裝載設定、用戶端 Proxy 產生與呼叫完整端到端流程。掌握這個最小模型,後續所有進階功能 (繫結、安全、例外、串流、雙向…) 皆在此基礎上延伸。

WCF 核心架構三要素 (ABC)

  • A - Address (位址):服務在哪裡 (如 https://localhost:3502/ServiceHost/Sample/Hello.svc)
  • B - Binding (繫結):如何通訊 (本例使用 basicHttpBinding)
  • C - Contract (契約):提供什麼功能 (本例 IHello.SayHello)
Endpoint = A + B + C。服務可暴露多個 Endpoint,滿足不同用戶端需求。

完整程式碼範例

1. 定義服務契約 (介面)

// IHello.cs
using System.ServiceModel;

namespace WCF.ServiceLib.Sample
{
    /// 服務契約介面
    [ServiceContract]
    public interface IHello
    {
        /// 操作契約:定義單一公開方法
        [OperationContract]
        string SayHello(string name);
    }
}

2. 實作服務邏輯 (類別)

// Hello.cs
namespace WCF.ServiceLib.Sample
{
    /// 服務實作類別
    public class Hello : IHello
    {
        public string SayHello(string name) => $"Hello: {name}";
    }
}

3. IIS 裝載 — .svc 檔案與 Web.config

<!-- Hello.svc -->
<%@ ServiceHost Language="C#" Debug="true" Service="WCF.ServiceLib.Sample.Hello" %>
<!-- Web.config -->
<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SampleBehavior">
          <!-- 發布中繼資料,讓用戶端可透過 Add Service Reference 產生 Proxy -->
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service name="WCF.ServiceLib.Sample.Hello" behaviorConfiguration="SampleBehavior">
        <!-- 端點:Address="" 表示使用基底位址,Binding=basicHttpBinding, Contract=IHello -->
        <endpoint address="" binding="basicHttpBinding" contract="WCF.ServiceLib.Sample.IHello" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

4. 部署至 IIS 步驟

  1. 在 IIS 建立網站/應用程式,實體路徑指向含 `.svc` 與 `Web.config` 的資料夾
  2. 應用程式集區設定:.NET CLR Version = v4.0、Managed Pipeline Mode = Integrated
  3. 瀏覽器測試:https://localhost:3502/ServiceHost/Sample/Hello.svc → 應顯示服務說明頁面並含 WSDL 連結

5. 用戶端 — 加入服務參考產生 Proxy

  1. Visual Studio → 專案右鍵 → Add Service Reference
  2. Address 輸入:https://localhost:3502/ServiceHost/Sample/Hello.svc → Go
  3. Namespace 命名:Sample → OK
  4. VS 自動產生 `Reference.cs` (Proxy 類別 `HelloClient`)、更新 `Web.config`/`App.config`

產生的用戶端 Web.config (自動)

<system.serviceModel>
  <client>
    <endpoint address="https://localhost:3502/ServiceHost/Sample/Hello.svc"
              binding="basicHttpBinding"
              contract="Sample.IHello" />
  </client>
</system.serviceModel>

6. 用戶端呼叫程式碼 (ASP.NET Web Form)

// Hello.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Hello.aspx.cs" Inherits="Sample_Hello" %>
<asp:TextBox ID="txtName" runat="server" Text="webabcd" />
<asp:Button ID="btnSayHello" runat="server" Text="Hello" OnClick="btnSayHello_Click" />

// Hello.aspx.cs
public partial class Sample_Hello : System.Web.UI.Page
{
    protected void btnSayHello_Click(object sender, EventArgs e)
    {
        // 使用產生的 Proxy 類別
        var proxy = new Sample.HelloClient();
        try
        {
            string result = proxy.SayHello(txtName.Text);
            ClientScript.RegisterStartupScript(GetType(), "msg", $"alert('{result}');", true);
        }
        finally
        {
            // 正確關閉通道模式
            if (proxy.State == System.ServiceModel.CommunicationState.Faulted)
                proxy.Abort();
            else
                proxy.Close();
        }
    }
}

執行結果驗證

  1. 輸入名稱 (預設 "webabcd")
  2. 點擊「Hello」按鈕
  3. 瀏覽器彈出警告視窗:Hello: webabcd

新手常見問題 FAQ

  1. Q: .svc 檔案 404 Not Found?
    A: 確認 IIS 已安裝 WCF 啟用功能:
    控制台 → 程式集 → 開啟或關閉 Windows 功能 → WCF Services → HTTP Activation
  2. Q: Add Service Reference 失敗「無法下載中繼資料」?
    A: Web.config 需啟用 ``,且防火牆允許該 Port。
  3. Q: 呼叫報錯「EndpointNotFoundException」?
    A: 用戶端 config 的 endpoint address 必須與 .svc 實際 URL 完全一致。
  4. Q: 為什麼要用 `proxy.Close()` 不直接 `Dispose()`?
    A: WCF Client 實作 `ICommunicationObject`,`Close()` 會優雅關閉會話;若通道已 Faulted,`Close()` 會拋例外,需改呼叫 `Abort()`。建議使用 `try/finally + SafeClose` 模式。

進階延伸:最小模型的四個擴展方向

方向修改點對應教學篇章
換繫結 (TCP/HTTPS/命名管道)Web.config <binding>、端點 address第 3 篇 Binding
傳遞複雜物件 (List、繼承類別)加 [DataContract]/[DataMember]/[KnownType]第 2 篇 Contract
錯誤處理與 FaultException介面加 [FaultContract]、實作拋 FaultException<T>第 4 篇 例外處理
大檔案上傳/串流binding transferMode="Streamed"、MessageContract+Stream第 8 篇 串流傳輸

原始碼結構建議

Solution.sln
├─ WCF.ServiceLib          (契約與實作,Class Library,可共用給用戶端)
│  ├─ Sample
│  │  ├─ IHello.cs
│  │  └─ Hello.cs
│  └─ ...
├─ WCF.ServiceHost         (IIS 裝載專案,Web Site)
│  ├─ Sample
│  │  ├─ Hello.svc
│  │  └─ Web.config
│  └─ ...
└─ Client.Web              (用戶端專案,ASP.NET / WPF / Console)
   ├─ Service References/Sample/ (Add Service Reference 產生)
   └─ ...
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved