共用方式為


HOW TO:在 Managed 應用程式中裝載 WCF 服務

若要將服務裝載於 Managed 應用程式中,請將服務的程式碼嵌入 Managed 應用程式的程式碼,再以命令式程式碼或透過組態以宣告方式定義服務的端點 (亦可使用預設端點),然後建立 ServiceHost 的執行個體。

若要開始接收訊息,請呼叫 ServiceHost 上的 Open。 這樣會建立並開啟服務的接聽項。 用這種方式來裝載服務一般稱為「自我裝載」,因為 Managed 應用程式會自行執行裝載工作。 若要關閉服務,請呼叫 ServiceHost 上的 System.ServiceModel.Channels.CommunicationObject.Close

您也可以透過 Managed Windows 服務、網際網路資訊服務 (IIS),或是 Windows Process Activation Service (WAS) 來裝載服務。如需詳細資訊服務的裝載選項的詳細資訊,請參閱裝載服務

將服務裝載在 Managed 應用程式中是最有彈性的選項,因為這麼做只需要部署最基本基礎結構。如需詳細資訊 將服務裝載在 Managed 應用程式的詳細資訊,請參閱在 Managed 應用程式中裝載

下列程序示範如何在主控台應用程式中實作自我裝載的服務。

建立自我裝載服務

  1. 開啟 Visual Studio 2010,再依序選取 [檔案] 功能表上的 [新增] 和 [專案]。

  2. 依序選取 [已安裝的範本] 清單中的 [Visual C#] 和 [Windows] 或是 [Visual Basic] 和 [Windows]。 視您如何設定 Visual Studio 2010,這些項目其一或兩者在 [已安裝的範本] 清單中可能位於 [其他語言] 節點底下。

  3. 選取 [Windows] 清單中的 [主控台應用程式]。 在 [名稱] 方塊中輸入 SelfHost,然後按一下 [確定]。

  4. 以滑鼠右鍵按一下 [方案總管] 中的 [SelfHost],然後選取 [加入參考]。 選取 [.NET] 索引標籤上的 [System.ServiceModel],然後按一下 [確定]。

    ms731758.Tip(zh-tw,VS.100).gif提示:
    如果看不到 [方案總管] 視窗,請選取 [檢視] 功能表上的 [方案總管]。

  5. 按兩下 [方案總管] 中的 [Program.cs] 或 [Module1.vb],開啟檔案的程式碼視窗 (如果尚未開啟)。 在檔案最上方加入下列陳述式。

    Imports System.ServiceModel
    Imports System.ServiceModel.Description
    
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
  6. 定義與實作服務合約。 本範例會定義 HelloWorldService 以根據輸入服務的資料傳回訊息。

    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface
    
    Public Class HelloWorldService
        Implements IHelloWorldService
    
        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class
    
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }
    
    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }
    
    ms731758.note(zh-tw,VS.100).gif注意:
    如需詳細資訊如何定義與實作服務介面的詳細資訊,請參閱 HOW TO:定義 Windows Communication Foundation 服務合約HOW TO:實作 Windows Communication Foundation 服務合約

  7. Main 方法頂端使用服務的基底位址,建立 Uri 類別的執行個體。

    Dim baseAddress As Uri = New Uri("https://localhost:8080/hello")
    
    Uri baseAddress = new Uri("https://localhost:8080/hello");
    
  8. 建立 ServiceHost 類別的執行個體,並將代表服務類型與基底位址統一資源識別元 (URI) 的 Type 傳入 ServiceHost。 啟用中繼資料發行,然後呼叫 ServiceHostOpen 方法初始化服務並準備接收訊息。

    ' Create the ServiceHost.
    Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)
    
        ' Enable metadata publishing.
        Dim smb As New ServiceMetadataBehavior()
        smb.HttpGetEnabled = True
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
        host.Description.Behaviors.Add(smb)
    
        ' Open the ServiceHost to start listening for messages. Since
        ' no endpoints are explicitly configured, the runtime will create
        ' one endpoint per base address for each service contract implemented
        ' by the service.
        host.Open()
    
        Console.WriteLine("The service is ready at {0}", baseAddress)
        Console.WriteLine("Press <Enter> to stop the service.")
        Console.ReadLine()
    
        ' Close the ServiceHost.
        host.Close()
    
    End Using
    
    // Create the ServiceHost.
    using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
    {
        // Enable metadata publishing.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        host.Description.Behaviors.Add(smb);
    
        // Open the ServiceHost to start listening for messages. Since
        // no endpoints are explicitly configured, the runtime will create
        // one endpoint per base address for each service contract implemented
        // by the service.
        host.Open();
    
        Console.WriteLine("The service is ready at {0}", baseAddress);
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
    
        // Close the ServiceHost.
        host.Close();
    }
    
    ms731758.note(zh-tw,VS.100).gif注意:
    本範例將使用預設端點,所以這項服務不需要組態檔。 如果沒有設定端點,執行階段則會針對服務所實作的每份服務合約,為每個基底位址各建立一個端點。如需詳細資訊預設端點的詳細資訊,請參閱簡化的組態WCF 服務的簡化組態

  9. 按 CTRL+SHIFT+B 建置方案。

若要測試服務

  1. 按 Ctrl + F5 執行服務。

  2. 開啟 WCF 測試用戶端

    ms731758.Tip(zh-tw,VS.100).gif提示:
    若要開啟 WCF 測試用戶端,請開啟 Visual Studio 2010 命令提示字元並執行 WcfTestClient.exe

  3. 選取 [檔案] 功能表上的 [新增服務]。

  4. 在位址方塊中輸入 https://localhost:8080/hello,然後按一下 [確定]。

    ms731758.Tip(zh-tw,VS.100).gif提示:
    請確認服務正在執行中,否則這個步驟會失敗。 若您已從程式碼變更了基底位址,即應在此步驟中使用修改後的基底位址。

  5. 按兩下 [我的服務專案] 節點底下的 [SayHello]。 在 [要求] 清單中的 [] 欄內輸入您的名稱,然後按一下 [叫用]。 回覆訊息隨即出現在 [回應] 清單中。

範例

下列範例會建立 ServiceHost 物件來裝載型別為 HelloWorldService 的服務,然後呼叫 ServiceHostOpen 方法。 基底位址由程式碼提供、中繼資料發行已啟用,而且將使用預設端點。

Imports System.ServiceModel
Imports System.ServiceModel.Description

Module Module1

    <ServiceContract()>
    Public Interface IHelloWorldService
        <OperationContract()>
        Function SayHello(ByVal name As String) As String
    End Interface
    
    Public Class HelloWorldService
        Implements IHelloWorldService

        Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
            Return String.Format("Hello, {0}", name)
        End Function
    End Class

    Sub Main()
        Dim baseAddress As Uri = New Uri("https://localhost:8080/hello")

        ' Create the ServiceHost.
        Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)

            ' Enable metadata publishing.
            Dim smb As New ServiceMetadataBehavior()
            smb.HttpGetEnabled = True
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
            host.Description.Behaviors.Add(smb)

            ' Open the ServiceHost to start listening for messages. Since
            ' no endpoints are explicitly configured, the runtime will create
            ' one endpoint per base address for each service contract implemented
            ' by the service.
            host.Open()

            Console.WriteLine("The service is ready at {0}", baseAddress)
            Console.WriteLine("Press <Enter> to stop the service.")
            Console.ReadLine()

            ' Close the ServiceHost.
            host.Close()

        End Using

    End Sub

End Module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace SelfHost
{
    [ServiceContract]
    public interface IHelloWorldService
    {
        [OperationContract]
        string SayHello(string name);
    }

    public class HelloWorldService : IHelloWorldService
    {
        public string SayHello(string name)
        {
            return string.Format("Hello, {0}", name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Uri baseAddress = new Uri("https://localhost:8080/hello");

            // Create the ServiceHost.
            using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
            {
                // Enable metadata publishing.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);

                // Open the ServiceHost to start listening for messages. Since
                // no endpoints are explicitly configured, the runtime will create
                // one endpoint per base address for each service contract implemented
                // by the service.
                host.Open();

                Console.WriteLine("The service is ready at {0}", baseAddress);
                Console.WriteLine("Press <Enter> to stop the service.");
                Console.ReadLine();

                // Close the ServiceHost.
                host.Close();
            }
        }
    }
}

另請參閱

工作

HOW TO:在 IIS 中裝載 WCF 服務
自我裝載
HOW TO:定義 Windows Communication Foundation 服務合約
HOW TO:實作 Windows Communication Foundation 服務合約

參考

Uri
AppSettings
ConfigurationManager

概念

裝載服務
ServiceModel 中繼資料公用程式工具 (Svcutil.exe)
使用繫結來設定服務和用戶端
系統提供的繫結