方法 : 基本的な Windows Communication Foundation サービスをホストおよび実行する
これは、基本的な Windows Communication Foundation (WCF) サービスと、そのサービスを呼び出すことができるクライアントの作成に必要な 6 つのタスクのうち、3 番目のタスクです。6 つのすべてのタスクの概要については、「チュートリアル入門」を参照してください。
ここでは基本的な Windows Communication Foundation (WCF) サービスを実行する方法を説明します。この操作は、次の手順から構成されます。
サービスのベース アドレスを作成します。
サービスのサービス ホストを作成します。
メタデータ交換を有効にします。
サービス ホストを開きます。
このタスクで書かれるコードの全容は手順に続いて提供されている例で見ることができます。Program
クラスに定義されている Main()
メソッド内に次のコードを追加します。このクラスは Service
ソリューションを作成したときに生成されたものです。
サービスのベース アドレスを構成するには
サービスのベース アドレス用に Uri インスタンスを作成します。この URI は、HTTP スキーム、ローカル コンピューター、ポート番号 8000、およびサービスへのパスとして ServiceModelSample/Service を指定します。このパスは、サービス コントラクトでサービスの名前空間に指定されたものです。
Dim baseAddress As New Uri("https://localhost:8000/ServiceModelSamples/Service")
Uri baseAddress = new Uri("https://localhost:8000/ServiceModelSamples/Service");
サービスをホストするには
System.ServiceModel.Description
名前空間をインポートします。このコード行は、using ステートメントまたは imports ステートメントの残りの部分と共に Program.cs/Program.vb ファイルの一番上に書き込まれている必要があります。Imports System.ServiceModel.Description
using System.ServiceModel.Description;
新しい ServiceHost インスタンスを作成し、サービスをホストします。サービス コントラクトを実装する型とベース アドレスを指定する必要があります。この例では、ベース アドレスが
https://localhost:8000/ServiceModelSamples/Service
、サービス コントラクトを実装する型がCalculatorService
になっています。Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
CommunicationException をキャッチする try-catch ステートメントを追加し、try ブロックに次の 3 つの手順のコードを追加します。catch 句はエラー メッセージを表示してから
selfHost.Abort()
を呼び出す必要があります。Try ' ... Catch ce As CommunicationException Console.WriteLine("An exception occurred: {0}", ce.Message) selfHost.Abort() End Try
try { // ... } catch (CommunicationException ce) { Console.WriteLine("An exception occurred: {0}", ce.Message); selfHost.Abort(); }
サービスを公開するエンドポイントを追加します。これを行うには、エンドポイントが公開するコントラクト、バインディング、エンドポイントのアドレスを指定する必要があります。この例では、コントラクトとして
ICalculator
を、バインディングとしてWSHttpBinding
を、アドレスとしてCalculatorService
をそれぞれ指定します。ここでは、エンドポイントのアドレスが相対アドレスになっていることに注意してください。エンドポイントの完全なアドレスは、ベース アドレスとエンドポイントのアドレスを組み合わせたものです。この場合、完全なアドレスはhttps://localhost:8000/ServiceModelSamples/Service/CalculatorService
になります。' Add a service endpoint selfHost.AddServiceEndpoint( _ GetType(ICalculator), _ New WSHttpBinding(), _ "CalculatorService")
selfHost.AddServiceEndpoint( typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
注 : サービスに対してエンドポイントが明示的に構成されておらず、ServiceHost が開いているときにランタイムによって既定のエンドポイントが追加される場合は、.NET Framework 4 から開始します。この例ではエンドポイントを明示的に追加し、その方法の例を提供します。既定のエンドポイント、バインド、および動作詳細情報、「簡略化された構成」および「WCF サービスの簡略化された構成」を参照してください。 メタデータ交換を有効にします。これを行うには、サービス メタデータの動作を追加します。まず、ServiceMetadataBehavior インスタンスを作成し、HttpGetEnabled プロパティを true に設定します。次に、新しい動作をサービスに追加します。メタデータ公開時のセキュリティ問題詳細情報、「Security Considerations with Metadata」を参照してください。
' Enable metadata exchange Dim smb As New ServiceMetadataBehavior() smb.HttpGetEnabled = True selfHost.Description.Behaviors.Add(smb)
ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; selfHost.Description.Behaviors.Add(smb);
ServiceHost を開き、受信メッセージを待ちます。ユーザーが Enter キーを押すと ServiceHost が終了します。
selfHost.Open() Console.WriteLine("The service is ready.") Console.WriteLine("Press <ENTER> to terminate service.") Console.WriteLine() Console.ReadLine() ' Close the ServiceHostBase to shutdown the service. selfHost.Close()
selfHost.Open(); Console.WriteLine("The service is ready."); Console.WriteLine("Press <ENTER> to terminate service."); Console.WriteLine(); Console.ReadLine(); // Close the ServiceHostBase to shutdown the service. selfHost.Close();
サービスが正常に機能していることを確認するには
service.exe を Visual Studio 内から実行します。Windows Vista 上で実行されるサービスには、管理者権限が必要です。Visual Studio は管理者権限で実行されているため、service.exe も管理者権限で実行される必要があります。新しいコマンド プロンプトを管理者権限で開いて、service.exe をその中で実行することもできます。
Internet Explorer を開いて、サービスのデバッグ ページである https://localhost:8000/ServiceModelSamples/Service に移動します。
例
次の例では、チュートリアルの前の手順で作成したサービス コントラクトと実装を含め、コンソール アプリケーションでサービスをホストします。次のコードを Service.exe という名前の実行可能ファイルにコンパイルします。
コードのコンパイル時に、System.ServiceModel.dll が参照されることを確認してください。
Imports System
Imports System.ServiceModel
Imports System.ServiceModel.Description
Module Service
' Define a service contract.
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
<OperationContract()> _
Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
End Interface
' Service class that implements the service contract.
' Added code to write output to the console window.
Public Class CalculatorService
Implements ICalculator
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
Dim result As Double = n1 + n2
Console.WriteLine("Received Add({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
Dim result As Double = n1 - n2
Console.WriteLine("Received Subtract({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
Dim result As Double = n1 * n2
Console.WriteLine("Received Multiply({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
Dim result As Double = n1 / n2
Console.WriteLine("Received Divide({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
End Class
Class Program
Shared Sub Main()
' Step 1 of the address configuration procedure: Create a URI to serve as the base address.
Dim baseAddress As New Uri("https://localhost:8000/ServiceModelSamples/Service")
' Step 2 of the hosting procedure: Create ServiceHost
Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
Try
' Step 3 of the hosting procedure: Add a service endpoint.
' Add a service endpoint
selfHost.AddServiceEndpoint( _
GetType(ICalculator), _
New WSHttpBinding(), _
"CalculatorService")
' Step 4 of the hosting procedure: Enable metadata exchange.
' Enable metadata exchange
Dim smb As New ServiceMetadataBehavior()
smb.HttpGetEnabled = True
selfHost.Description.Behaviors.Add(smb)
' Step 5 of the hosting procedure: Start (and then stop) the service.
selfHost.Open()
Console.WriteLine("The service is ready.")
Console.WriteLine("Press <ENTER> to terminate service.")
Console.WriteLine()
Console.ReadLine()
' Close the ServiceHostBase to shutdown the service.
selfHost.Close()
Catch ce As CommunicationException
Console.WriteLine("An exception occurred: {0}", ce.Message)
selfHost.Abort()
End Try
End Sub
End Class
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace Microsoft.ServiceModel.Samples
{
// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
// Service class that implements the service contract.
// Added code to write output to the console window.
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
double result = n1 + n2;
Console.WriteLine("Received Add({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Subtract(double n1, double n2)
{
double result = n1 - n2;
Console.WriteLine("Received Subtract({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Multiply(double n1, double n2)
{
double result = n1 * n2;
Console.WriteLine("Received Multiply({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Divide(double n1, double n2)
{
double result = n1 / n2;
Console.WriteLine("Received Divide({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
}
class Program
{
static void Main(string[] args)
{
// Step 1 of the address configuration procedure: Create a URI to serve as the base address.
Uri baseAddress = new Uri("https://localhost:8000/ServiceModelSamples/Service");
// Step 2 of the hosting procedure: Create ServiceHost
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
try
{
// Step 3 of the hosting procedure: Add a service endpoint.
selfHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
"CalculatorService");
// Step 4 of the hosting procedure: Enable metadata exchange.
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
// Step 5 of the hosting procedure: Start (and then stop) the service.
selfHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
selfHost.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine("An exception occurred: {0}", ce.Message);
selfHost.Abort();
}
}
}
}
注 : |
---|
このようなサービスには、リッスンを行うコンピューター上で HTTP アドレスを登録するためのアクセス許可が必要です。管理者アカウントにはこのアクセス許可がありますが、管理者以外のアカウントの場合は、HTTP 名前空間へのアクセス許可を付与する必要があります。名前空間予約の構成方法詳細情報、「HTTP および HTTPS の構成」を参照してください。Visual Studio での service.exe の実行には、管理者権限が必要です。 |
これでサービスが実行されていることが確認できました。「方法 : Windows Communication Foundation クライアントを作成する」に進んでください。トラブルシューティングの詳細については、「チュートリアル入門のトラブルシューティング」を参照してください。