Share via


教學課程:裝載和執行基本 Windows Communication Foundation 服務

本教學課程說明建立基本 Windows Communication Foundation (WCF) 應用程式所需的五項工作中的第三項。 如需教學課程的概觀,請參閱教學課程:開始使用 Windows Communication Foundation 應用程式

建立 WCF 應用程式的下一項工作,是在主控台應用程式中裝載 WCF 服務。 WCF 服務會公開一或多個端點,其中每個端點都會公開一或多項服務作業。 服務端點會指定下列資訊:

  • 一個位址,您可以在其中找到服務。
  • 一個繫結,其中包含的資訊說明用戶端必須如何與服務通訊。
  • 一個合約,定義服務提供給其用戶端的功能。

在本教學課程中,您會了解如何:

  • 建立及設定裝載 WCF 服務的主控台應用程式專案。
  • 新增程式碼以裝載 WCF 服務。
  • 更新組態檔。
  • 啟動 WCF 服務並確認正在執行中。

建立及設定裝載服務的主控台應用程式專案

  1. 在 Visual Studio 中建立主控台應用程式專案:

    1. 從 [檔案] 功能表中選取 [開啟]>[專案/解決方案],然後瀏覽至您先前建立的 GettingStarted 解決方案 (GettingStarted.sln)。 選取開啟

    2. 從 [檢視] 功能表中選取 [方案總管]

    3. 在 [方案總管] 視窗中選取 [GettingStarted] 解決方案 (最上層節點),然後從捷徑功能表中選取 [新增]>[新增專案]

    4. 在 [新增專案] 視窗左側,選取 [Visual C#] 或 [Visual Basic] 底下的 [Windows 桌面] 類別。

    5. 選取 [主控台應用程式 (.NET Framework)] 範本,然後輸入 GettingStartedHost 作為 [名稱]。 選取 [確定]。

  2. GettingStartedHost 專案中的參考新增至 GettingStartedLib 專案:

    1. 在 [方案總管] 視窗中,選取 GettingStartedHost 專案底下的 [參考] 資料夾,然後從捷徑功能表中選取 [新增參考]

    2. 在 [新增參考] 對話方塊中,從視窗左側的 [專案] 底下選取 [解決方案]

    3. 選取視窗中央區段的 GettingStartedLib,然後選取 [確定]

      此動作讓 GettingStartedHost 專案能夠使用 GettingStartedLib 專案中定義的型別。

  3. GettingStartedHost 專案中的參考新增至 System.ServiceModel 組件:

    1. 在 [方案總管] 視窗中,選取 GettingStartedHost 專案底下的 [參考] 資料夾,然後從捷徑功能表中選取 [新增參考]

    2. 在 [新增參考] 視窗左側,選取 [組件] 底下的 [架構]

    3. 選取 System.ServiceModel,然後選取 [確定]

    4. 選取 [檔案]>[全部儲存] 以儲存解決方案。

新增程式碼以裝載服務

若要裝載服務,您可以新增程式碼以執行下列步驟:

  1. 建立基底位址的 URI。
  2. 建立用來裝載服務的類別執行個體。
  3. 建立服務端點。
  4. 啟用中繼資料交換。
  5. 開啟服務主機以接聽傳入訊息。

對程式碼進行以下更改:

  1. GettingStartedHost 專案中開啟 Program.csModule1.vb 檔案,並將其程式碼取代為下列程式碼:

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using GettingStartedLib;
    
    namespace GettingStartedHost
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Step 1: Create a URI to serve as the base address.
                Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");
    
                // Step 2: Create a ServiceHost instance.
                ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    
                try
                {
                    // Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
    
                    // Step 4: Enable metadata exchange.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    selfHost.Description.Behaviors.Add(smb);
    
                    // Step 5: Start the service.
                    selfHost.Open();
                    Console.WriteLine("The service is ready.");
    
                    // Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.");
                    Console.WriteLine();
                    Console.ReadLine();
                    selfHost.Close();
                }
                catch (CommunicationException ce)
                {
                    Console.WriteLine("An exception occurred: {0}", ce.Message);
                    selfHost.Abort();
                }
            }
        }
    }
    
    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    Imports GettingStartedLib.GettingStartedLib
    
    Module Service
    
        Class Program
            Shared Sub Main()
                ' Step 1: Create a URI to serve as the base address.
                Dim baseAddress As New Uri("http://localhost:8000/GettingStarted/")
    
                ' Step 2: Create a ServiceHost instance.
                Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
               Try
    
                    ' Step 3: Add a service endpoint.
                    selfHost.AddServiceEndpoint( _
                        GetType(ICalculator), _
                        New WSHttpBinding(), _
                        "CalculatorService")
    
                    ' Step 4: Enable metadata exchange.
                    Dim smb As New ServiceMetadataBehavior()
                    smb.HttpGetEnabled = True
                    selfHost.Description.Behaviors.Add(smb)
    
                    ' Step 5: Start the service.
                    selfHost.Open()
                    Console.WriteLine("The service is ready.")
    
                    ' Close the ServiceHost to stop the service.
                    Console.WriteLine("Press <Enter> to terminate the service.")
                    Console.WriteLine()
                    Console.ReadLine()
                    selfHost.Close()
    
                Catch ce As CommunicationException
                    Console.WriteLine("An exception occurred: {0}", ce.Message)
                    selfHost.Abort()
                End Try
            End Sub
        End Class
    
    End Module
    

    如需此程式碼運作方式的相關資訊,請參閱服務裝載程式步驟

  2. 更新專案屬性:

    1. 在 [方案總管] 視窗中選取 [GettingStartedHost] 資料夾,然後從捷徑功能表中選取 [屬性]

    2. 在 [GettingStartedHost] 屬性頁面上,選取 [應用程式] 索引標籤:

      • 針對 C# 專案,請從 [啟始物件] 清單中選取 GettingStartedHost.Program

      • 針對 Visual Basic 專案,請從 [啟始物件] 清單中選取 Service.Program

    3. 從 [檔案] 功能表中選取 [全部儲存]

確認服務正在執行

  1. 建置解決方案,然後從 Visual Studio 內執行 GettingStartedHost 主控台應用程式。

    此服務必須以系統管理員權限執行。 由於您是以系統管理員權限開啟 Visual Studio 的,當您在 Visual Studio 中執行 GettingStartedHost 時,應用程式也會以系統管理員權限執行。 或者,您也可以用系統管理員身分開啟新的命令提示字元 (從捷徑功能表中選取 [更多]>[以系統管理員身分執行]),並在其中執行 GettingStartedHost.exe

  2. 開啟網頁瀏覽器,並經由 http://localhost:8000/GettingStarted/ 瀏覽至服務的頁面。

    注意

    此類服務需要適當權限才能將 HTTP 位址註冊到機器上,以便接聽。 系統管理員帳戶具有此權限,但是非系統管理員帳戶則必須被授與 HTTP 命名空間的權限。 如需如何設定命名空間保留的詳細資訊,請參閱設定 HTTP 和 HTTPS

服務裝載程式步驟

您在程式碼中新增用以裝載服務的步驟說明如下:

  • 步驟 1:建立 Uri 類別的執行個體以保存服務的基底位址。 包含基底位址的 URL 具有可識別服務的選用 URI。 基底位址的格式如下:<transport>://<machine-name or domain><:optional port #>/<optional URI segment>。 計算機服務的基底位址會使用 HTTP 傳輸、localhost、連接埠 8000 和 URI 區段 GettingStarted。

  • 步驟 2:建立 ServiceHost 類別的執行個體,供您用來裝載服務。 建構函式接受兩個參數:實作服務合約之類別的型別以及服務的基底位址。

  • 步驟 3:建立 ServiceEndpoint 執行個體。 服務端點是由位址、繫結和服務合約所組成。 ServiceEndpoint 建構函式由服務合約介面型別、繫結和位址組成。 服務合約是您在服務類型中所定義和實作的 ICalculator。 此範例的繫結是 WSHttpBinding,這是內建繫結,會連線至符合 WS-* 規格的端點。 如需 WCF 繫結的詳細資訊,請參閱 WCF 繫結概觀。 您可將位址附加至基底位址以識別端點。 此程式碼會將位址指定為 CalculatorService,並將端點的完整位址指定為 http://localhost:8000/GettingStarted/CalculatorService

    重要

    對於 .NET Framework 第 4 版和更新版本,新增服務端點是選擇性的。 在這些版本中,若未新增程式碼或組態,WCF 將會為服務所實作之合約與基底位址的每個組合新增一個預設端點。 如需預設端點的詳細資訊,請參閱指定端點位址。 如需預設端點、繫結和行為的詳細資訊,請參閱簡化的組態WCF 服務的簡化組態

  • 步驟 4:啟用中繼資料交換。 用戶端會使用中繼資料交換產生用來呼叫服務作業的 Proxy。 若要啟用中繼資料交換,請建立 ServiceMetadataBehavior 執行個體,將其 HttpGetEnabled 屬性設定為 true,並將 ServiceMetadataBehavior 物件新增至 ServiceHost 執行個體的 Behaviors 集合。

  • 步驟 5:開啟 ServiceHost 以接聽傳入訊息。 應用程式會等候您按 Enter 鍵。 應用程式具現化 ServiceHost 之後,會執行 try/catch 區塊。 若要深入了解如何安全地攔截 ServiceHost 擲回的例外狀況,請參閱使用 Close 和 Abort 釋放 WCF 用戶端資源

重要

在新增 WCF 服務程式庫時,如果您藉由啟動服務主機對其進行偵錯,Visual Studio 將會為您裝載該程式庫。 若要避免衝突,您可以阻止 Visual Studio 裝載 WCF 服務程式庫。

  1. 方案總管中選取 GettingStartedLib 專案,然後從捷徑功能表中選擇 [屬性]
  2. 選取 [WCF 選項],然後取消勾選 [在同一個方案中對另一個專案偵錯時啟動 WCF 服務主機]

下一步

在本教學課程中,您已了解如何:

  • 建立及設定裝載 WCF 服務的主控台應用程式專案。
  • 新增程式碼以裝載 WCF 服務。
  • 更新組態檔。
  • 啟動 WCF 服務並確認正在執行中。

前往下一個教學課程,了解如何建立 WCF 用戶端。