方法 : コードを使用してサービスのメタデータを公開する
これは、Windows Communication Foundation (WCF) サービスのメタデータの公開方法を説明する 2 つの「方法」トピックの 1 つです。構成ファイルとコードを使用して、サービスがメタデータを公開する手段を指定する方法は 2 つあります。このトピックでは、コードを使用してサービスのメタデータを公開する方法について説明します。
注意 : |
---|
このトピックでは、セキュリティで保護されていない方法でメタデータを公開する方法について説明します。クライアントは、サービスからメタデータを取得できます。セキュリティで保護された方法でメタデータを公開するサービスが必要な場合は、「カスタム セキュア メタデータ エンドポイント」を参照してください。 |
構成ファイル内の公開メタデータ詳細情報、「方法 : 構成ファイルを使用してサービスのメタデータを公開する」を参照してください。メタデータを公開すると、クライアントが ?wsdl クエリ文字列を使用した WS-Transfer GET 要求または HTTP/GET 要求によりメタデータを取得できるようになります。コードを機能させるには、基本的な WCF サービスを作成する必要があります。次のコードは基本的な自己ホスト型サービスの例です。
Imports System
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description
<ServiceContract()> _
Public Interface ISimpleService
<OperationContract()> _
Function SimpleMethod(ByVal msg As String) As String
End Interface
Class SimpleService
Implements ISimpleService
Public Function SimpleMethod(ByVal msg As String) As String Implements ISimpleService.SimpleMethod
Console.WriteLine("The caller passed in " + msg)
Return "Hello " + msg
End Function
End Class
using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace Metadata.Samples
{
[ServiceContract]
public interface ISimpleService
{
[OperationContract]
string SimpleMethod(string msg);
}
class SimpleService : ISimpleService
{
public string SimpleMethod(string msg)
{
Console.WriteLine("The caller passed in " + msg);
return "Hello " + msg;
}
}
コードでメタデータを公開するには
コンソール アプリケーションのメイン メソッド内で、サービス型とベース アドレスを渡して ServiceHost オブジェクトをインスタンス化します。
Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("https://localhost:8001/MetadataSample"))
ServiceHost svcHost = new ServiceHost(typeof(SimpleService), new Uri("https://localhost:8001/MetadataSample"));
手順 1. のコードのすぐ下に try ブロックを作成します。これにより、サービスの実行中にスローされる例外がすべてキャッチされます。
Try
try {
Catch commProblem As CommunicationException Console.WriteLine("There was a communication problem. " + commProblem.Message) Console.Read() End Try
} catch (CommunicationException commProblem) { Console.WriteLine("There was a communication problem. " + commProblem.Message); Console.Read(); }
サービス ホストに ServiceMetadataBehavior が含まれているかどうかを確認し、含まれていない場合は、新しい ServiceMetadataBehavior インスタンスを作成します。
'Check to see if the service host already has a ServiceMetadataBehavior Dim smb As ServiceMetadataBehavior = svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)() 'If not, add one If (smb Is Nothing) Then smb = New ServiceMetadataBehavior() End If
// Check to see if the service host already has a ServiceMetadataBehavior ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>(); // If not, add one if (smb == null) smb = new ServiceMetadataBehavior();
HttpGetEnabled プロパティを true. に設定します。
smb.HttpGetEnabled = True
smb.HttpGetEnabled = true;
ServiceMetadataBehavior には MetadataExporter プロパティが含まれています。MetadataExporter には PolicyVersion プロパティが含まれています。PolicyVersion プロパティの値を Policy15 に設定します。PolicyVersion プロパティを Policy12 に設定することもできます。Policy15 に設定すると、WS-Policy 1.5 に準拠したメタデータでポリシー情報がメタデータ エクスポーターによって生成されます。Policy12 に設定すると、WS-Policy 1.2 に準拠したポリシー情報がメタデータ エクスポーターによって生成されます。
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
ServiceMetadataBehavior インスタンスをサービス ホストの動作コレクションに追加します。
svcHost.Description.Behaviors.Add(smb)
svcHost.Description.Behaviors.Add(smb);
メタデータ交換エンドポイントをサービス ホストに追加します。
'Add MEX endpoint svcHost.AddServiceEndpoint( _ ServiceMetadataBehavior.MexContractName, _ MetadataExchangeBindings.CreateMexHttpBinding(), _ "mex")
// Add MEX endpoint svcHost.AddServiceEndpoint( ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex" );
アプリケーション エンドポイントをサービス ホストに追加します。
'Add application endpoint svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
// Add application endpoint svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
注 : エンドポイントをサービスに追加しない場合、ランタイムによって既定のエンドポイントが追加されます。この例では、サービスには true に設定された ServiceMetadataBehavior があるので、サービスで公開メタデータも有効化されています。既定のエンドポイント詳細情報、「簡略化された構成」および「WCF サービスの簡略化された構成」を参照してください。 サービス ホストを開き、受信呼び出しを待ちます。ユーザーが Enter キーを押すと、サービス ホストが終了します。
'Open the service host to accept incoming calls svcHost.Open() 'The service can now be accessed. Console.WriteLine("The service is ready.") Console.WriteLine("Press <ENTER> to terminate service.") Console.WriteLine() Console.ReadLine() 'Close the ServiceHostBase to shutdown the service. svcHost.Close()
// Open the service host to accept incoming calls svcHost.Open(); // The service can now be accessed. Console.WriteLine("The service is ready."); Console.WriteLine("Press <ENTER> to terminate service."); Console.WriteLine(); Console.ReadLine(); // Close the ServiceHostBase to shutdown the service. svcHost.Close();
コンソール アプリケーションのビルドと実行
Internet Explorer を使用してサービスのベース アドレス (この例では、https://localhost:8001/MetadataSample) を参照し、メタデータの公開が有効になっていることを確認します。上部の "サービスを作成しました" のすぐ下に "Simple Service" と表示された Web ページが表示されます。有効になっていない場合は、"このサービスのメタデータ公開は現在は無効になっています。" というメッセージが結果ページの上部に表示されます。
例
次のコード例は、コードを使用してサービスのメタデータを公開する基本的な WCF サービスの実装を示しています。
Imports System
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description
<ServiceContract()> _
Public Interface ISimpleService
<OperationContract()> _
Function SimpleMethod(ByVal msg As String) As String
End Interface
Class SimpleService
Implements ISimpleService
Public Function SimpleMethod(ByVal msg As String) As String Implements ISimpleService.SimpleMethod
Console.WriteLine("The caller passed in " + msg)
Return "Hello " + msg
End Function
End Class
Module Module1
Sub Main()
Dim svcHost As New ServiceHost(GetType(SimpleService), New Uri("https://localhost:8001/MetadataSample"))
Try
'Check to see if the service host already has a ServiceMetadataBehavior
Dim smb As ServiceMetadataBehavior = svcHost.Description.Behaviors.Find(Of ServiceMetadataBehavior)()
'If not, add one
If (smb Is Nothing) Then
smb = New ServiceMetadataBehavior()
End If
smb.HttpGetEnabled = True
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
svcHost.Description.Behaviors.Add(smb)
'Add MEX endpoint
svcHost.AddServiceEndpoint( _
ServiceMetadataBehavior.MexContractName, _
MetadataExchangeBindings.CreateMexHttpBinding(), _
"mex")
'Add application endpoint
svcHost.AddServiceEndpoint(GetType(ISimpleService), New WSHttpBinding(), "")
'Open the service host to accept incoming calls
svcHost.Open()
'The service can now be accessed.
Console.WriteLine("The service is ready.")
Console.WriteLine("Press <ENTER> to terminate service.")
Console.WriteLine()
Console.ReadLine()
'Close the ServiceHostBase to shutdown the service.
svcHost.Close()
Catch commProblem As CommunicationException
Console.WriteLine("There was a communication problem. " + commProblem.Message)
Console.Read()
End Try
End Sub
End Module
using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace Metadata.Samples
{
[ServiceContract]
public interface ISimpleService
{
[OperationContract]
string SimpleMethod(string msg);
}
class SimpleService : ISimpleService
{
public string SimpleMethod(string msg)
{
Console.WriteLine("The caller passed in " + msg);
return "Hello " + msg;
}
}
class Program
{
static void Main(string[] args)
{
ServiceHost svcHost = new ServiceHost(typeof(SimpleService), new Uri("https://localhost:8001/MetadataSample"));
try
{
// Check to see if the service host already has a ServiceMetadataBehavior
ServiceMetadataBehavior smb = svcHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
// If not, add one
if (smb == null)
smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
svcHost.Description.Behaviors.Add(smb);
// Add MEX endpoint
svcHost.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex"
);
// Add application endpoint
svcHost.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
// Open the service host to accept incoming calls
svcHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
svcHost.Close();
}
catch (CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
Console.Read();
}
}
}
}
参照
処理手順
方法 : マネージ アプリケーションで WCF サービスをホストする
自己ホスト
方法 : 構成ファイルを使用してサービスのメタデータを公開する