方法: マネージド アプリで WCF サービスをホストする
マネージド アプリケーションでサービスをホストするには、マネージド アプリケーション コード内にサービスのコードを埋め込み、サービスのエンドポイントをコードで強制的に定義するか、構成を使用して宣言により定義してから、または既定のエンドポイントを使用して、ServiceHost のインスタンスを作成します。
メッセージの受信を開始するには、Open で ServiceHost を呼び出します。 これにより、サービスのリスナーが作成されて開きます。 この方法によるサービスのホストは、マネージド アプリケーション自体がホスト作業を行うため、"自己ホスト" と呼ばれることがあります。 サービスを閉じるには、CommunicationObject.Close で ServiceHost を呼び出します。
サービスは、マネージド Windows サービス、インターネット インフォメーション サービス (IIS)、または Windows プロセス アクティブ化サービス (WAS) でホストすることもできます。 サービスのホスティング オプションの詳細については、「ホスティング サービス」を参照してください。
マネージド アプリケーションでのサービスのホスティングは、展開するインフラストラクチャが最小限で済むため、最も柔軟性があります。 マネージド アプリケーションでのホスティング サービスの詳細については、「マネージド アプリケーションのホスト」を参照してください。
次の手順では、自己ホスト型サービスをコンソール アプリケーションに実装する方法を示します。
自己ホスト型サービスを作成する
新しいコンソール アプリケーションを作成します。
Visual Studio を開き、 [ファイル] メニューから [新規]>[プロジェクト] を選択します。
[インストール済みのテンプレート] の一覧で [Visual C#] または [Visual Basic] を選択し、 [Windows デスクトップ] を選択します。
[コンソール アプリ] テンプレートを選択します。 [名前] ボックスに「
SelfHost
」と入力して、 [OK] を選択します。
ソリューション エクスプローラーで SelfHost を右クリックして、 [参照の追加] を選択します。 [.NET] タブで System.ServiceModel を選択して、 [OK] を選択します。
ヒント
[ソリューション エクスプローラー] ウィンドウが表示されない場合は、 [表示] メニューの [ソリューション エクスプローラー] を選択します。
まだ開いていない場合は、ソリューション エクスプローラーで Program.cs または Module1.vb をダブルクリックして、コード ウィンドウで開きます。 ファイルの先頭に、次のステートメントを追加します。
using System.ServiceModel; using System.ServiceModel.Description;
Imports System.ServiceModel Imports System.ServiceModel.Description
サービス コントラクトを定義して実装します。 この例では、サービスへの入力に基づいてメッセージを返す
HelloWorldService
を定義します。[ServiceContract] public interface IHelloWorldService { [OperationContract] string SayHello(string name); } public class HelloWorldService : IHelloWorldService { public string SayHello(string name) { return string.Format("Hello, {0}", name); } }
<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
Note
サービス インターフェイスを定義して実装する方法の詳細については、サービス コントラクトの定義方法およびサービス コントラクトの実装方法に関する記事を参照してください。
Main
メソッドの上部で、サービスのベース アドレスで Uri クラスのインスタンスを作成します。Uri baseAddress = new Uri("http://localhost:8080/hello");
Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
ServiceHost クラスのインスタンスを作成して、サービス型を表す Type とベース アドレス URI (Uniform Resource Identifier) を ServiceHost(Type, Uri[]) に渡します。 メタデータ公開を有効にして、Open で ServiceHost メソッドを呼び出し、サービスを初期化してメッセージを受信する準備をします。
// 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(); }
' 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
Note
この例では、既定のエンドポイントを使用するので、このサービスには構成ファイルは必要ありません。 エンドポイントが構成されていない場合、ランタイムは、サービスによって実装されたサービス コントラクトごとに 1 つのエンドポイントを各ベース アドレスに作成します。 既定のエンドポイントの詳細については、「簡易構成」と「WCF サービスの簡易構成」を参照してください。
Ctrl+Shift+B キーを押して、ソリューションをビルドします。
サービスをテストする
Ctrl+F5 キーを押してサービスを実行します。
[WCF テスト クライアント] を開きます。
ヒント
[WCF テスト クライアント] を開くには、Visual Studio の開発者コマンド プロンプトを開き、WcfTestClient.exe を実行します。
[ファイル] メニューの [サービスの追加] を選択します。
アドレス ボックスに「
http://localhost:8080/hello
」と入力して、 [OK] をクリックします。ヒント
サービスが実行していることを確認してください。サービスが実行していない場合、この手順は失敗します。 コードでベース アドレスを変更した場合は、この手順で、変更したアドレスを使用します。
[マイ サービス プロジェクト] ノードの SayHello をダブルクリックします。 自分の名前を [要求] ボックスの [値] 列に入力して、 [起動] をクリックします。
応答メッセージが [応答] の一覧に表示されます。
例
ServiceHost 型のサービスをホストする HelloWorldService
オブジェクトを作成し、Open で ServiceHost メソッドを呼び出す例を、次に示します。 ベース アドレスがコードで指定され、メタデータ公開が有効化されていて、既定のエンドポイントが使用されています。
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("http://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();
}
}
}
}
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("http://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