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 應用程式中裝載。
下列程序示範如何在主控台應用程式中實作自我裝載的服務。
建立自我裝載服務
開啟 Visual Studio 2010,再依序選取 [檔案] 功能表上的 [新增] 和 [專案]。
依序選取 [已安裝的範本] 清單中的 [Visual C#] 和 [Windows] 或是 [Visual Basic] 和 [Windows]。 視您如何設定 Visual Studio 2010,這些項目其一或兩者在 [已安裝的範本] 清單中可能位於 [其他語言] 節點底下。
選取 [Windows] 清單中的 [主控台應用程式]。 在 [名稱] 方塊中輸入
SelfHost
,然後按一下 [確定]。以滑鼠右鍵按一下 [方案總管] 中的 [SelfHost],然後選取 [加入參考]。 選取 [.NET] 索引標籤上的 [System.ServiceModel],然後按一下 [確定]。
提示: 如果看不到 [方案總管] 視窗,請選取 [檢視] 功能表上的 [方案總管]。 按兩下 [方案總管] 中的 [Program.cs] 或 [Module1.vb],開啟檔案的程式碼視窗 (如果尚未開啟)。 在檔案最上方加入下列陳述式。
Imports System.ServiceModel Imports System.ServiceModel.Description
using System.ServiceModel; using System.ServiceModel.Description;
定義與實作服務合約。 本範例會定義
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); } }
注意: 如需詳細資訊如何定義與實作服務介面的詳細資訊,請參閱 HOW TO:定義 Windows Communication Foundation 服務合約及 HOW TO:實作 Windows Communication Foundation 服務合約。 在
Main
方法頂端使用服務的基底位址,建立 Uri 類別的執行個體。Dim baseAddress As Uri = New Uri("https://localhost:8080/hello")
Uri baseAddress = new Uri("https://localhost:8080/hello");
建立 ServiceHost 類別的執行個體,並將代表服務類型與基底位址統一資源識別元 (URI) 的 Type 傳入 ServiceHost。 啟用中繼資料發行,然後呼叫 ServiceHost 的 Open 方法初始化服務並準備接收訊息。
' 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(); }
注意: 本範例將使用預設端點,所以這項服務不需要組態檔。 如果沒有設定端點,執行階段則會針對服務所實作的每份服務合約,為每個基底位址各建立一個端點。如需詳細資訊預設端點的詳細資訊,請參閱簡化的組態及WCF 服務的簡化組態。 按 CTRL+SHIFT+B 建置方案。
若要測試服務
按 Ctrl + F5 執行服務。
開啟 WCF 測試用戶端。
提示: 若要開啟 WCF 測試用戶端,請開啟 Visual Studio 2010 命令提示字元並執行 WcfTestClient.exe。 選取 [檔案] 功能表上的 [新增服務]。
在位址方塊中輸入
https://localhost:8080/hello
,然後按一下 [確定]。提示: 請確認服務正在執行中,否則這個步驟會失敗。 若您已從程式碼變更了基底位址,即應在此步驟中使用修改後的基底位址。 按兩下 [我的服務專案] 節點底下的 [SayHello]。 在 [要求] 清單中的 [值] 欄內輸入您的名稱,然後按一下 [叫用]。 回覆訊息隨即出現在 [回應] 清單中。
範例
下列範例會建立 ServiceHost 物件來裝載型別為 HelloWorldService
的服務,然後呼叫 ServiceHost 的 Open 方法。 基底位址由程式碼提供、中繼資料發行已啟用,而且將使用預設端點。
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)
使用繫結來設定服務和用戶端
系統提供的繫結