メタデータ公開動作

Metadata のサンプルでは、サービスのメタデータ公開機能を制御する方法を示します。 機密性の高いサービス メタデータが誤って公開されるのを防ぐために、Windows Communication Foundation (WCF) サービスの既定の構成では、メタデータの公開は無効になっています。 この動作は、既定ではセキュリティで保護されますが、同時に、サービスの構成の中でメタデータ発行の動作が明示的に有効化されない限り、サービスの呼び出しに必要なクライアント コードをメタデータ インポート ツール (Svcutil.exe など) を使用して生成できないことも意味します。

重要

このサンプルでは、わかりやすくするために、セキュリティで保護されていないメタデータ公開エンドポイントを作成する方法を示します。 このようなエンドポイントを利用するコンシューマーは、匿名で、認証を受けていない可能性もあります。したがって、エンドポイントを配置する前には注意を払い、サービスのメタデータをパブリックに開示することが適切であることを確認する必要があります。 メタデータ エンドポイントをセキュリティで保護するサンプルについては、「カスタム セキュア メタデータ エンドポイント」のサンプルを参照してください。

このサンプルは、ICalculator サービス コントラクトを実装する「入門サンプル」に基づいています。 この例では、クライアントはコンソール アプリケーション (.exe) であり、サービスはインターネット インフォメーション サービス (IIS) によってホストされます。

Note

このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。

サービスでメタデータを公開するには、サービス上に ServiceMetadataBehavior を構成する必要があります。 この動作が存在する場合は、エンドポイントを構成してメタデータを公開し、IMetadataExchange コントラクトを WS-MetadataExchange (MEX) プロトコルの実装として公開できます。 便宜上、このコントラクトには、構成名を略した "IMetadataExchange" という名前が付けられています。 このサンプルでは、mexHttpBinding を使用します。これは使いやすい標準バインディングで、セキュリティ モードが wsHttpBinding に設定されている None と同等です。 エンドポイントには、相対アドレスの "mex" が使用されています。このアドレスがサービスのベース アドレスに対して解決されると、エンドポイントのアドレスは http://localhost/servicemodelsamples/service.svc/mex になります。 この動作の構成を次に示します。

<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <!-- The serviceMetadata behavior publishes metadata through
           the IMetadataExchange contract. When this behavior is
           present, you can expose this contract through an endpoint
           as shown below. Setting httpGetEnabled to true publishes
           the service's WSDL at the <baseaddress>?wsdl, for example,
           http://localhost/servicemodelsamples/service.svc?wsdl -->
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

MEX エンドポイントを次に示します。

<!-- the MEX endpoint is exposed at
     http://localhost/servicemodelsamples/service.svc/mex
     To expose the IMetadataExchange contract, you
     must enable the serviceMetadata behavior as demonstrated
     previously. -->
<endpoint address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange" />

このサンプルでは、HttpGetEnabled プロパティを true に設定します。これにより、HTTP GET を使用してサービスのメタデータも公開されます。 HTTP GET メタデータのエンドポイントを有効にするには、サービスに HTTP ベース アドレスが設定されている必要があります。 クエリ文字列 ?wsdl は、メタデータにアクセスするサービスのベース アドレスで使用されます。 たとえば、Web ブラウザーでサービスの WSDL を表示するには、アドレス http://localhost/servicemodelsamples/service.svc?wsdl を使用します。 または、HttpsGetEnabledtrue に設定してこの動作を使用することにより、HTTPS を通じてメタデータを公開することもできます。 これには、HTTPS ベース アドレスが必要です。

サービスの MEX エンドポイントにアクセスするには、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を使用します。

svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs

これにより、サービスのメタデータに基づくクライアントが生成されます。

HTTP GET を使用してサービスのメタデータにアクセスするには、ブラウザーで http://localhost/servicemodelsamples/service.svc?wsdl にアクセスします。

この動作を削除してサービスを開こうとすると、例外が発生します。 動作がない場合にこのエラーが発生するのは、IMetadataExchange コントラクトを使用して構成されたエンドポイントに実装が存在しないからです。

HttpGetEnabledfalse に設定すると、サービスのメタデータが表示される代わりに CalculatorService ヘルプ ページが表示されます。

サンプルをセットアップ、ビルド、および実行するには

  1. Windows Communication Foundation サンプルの 1 回限りのセットアップの手順を実行したことを確認します。

  2. ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「 Building the Windows Communication Foundation Samples」の手順に従います。

  3. 単一または複数コンピューター構成でサンプルを実行するには、「Windows Communication Foundation サンプルの実行」の手順に従います。