次の方法で共有


メタデータ発行の動作

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

Von Bedeutung

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

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

このサンプルのセットアップ手順とビルド手順は、このトピックの最後にあります。

サービスがメタデータを公開するには、サービスで ServiceMetadataBehavior を構成する必要があります。 この動作が存在する場合は、WS-MetadataExchange (MEX) プロトコルの実装として IMetadataExchange コントラクトを公開するようにエンドポイントを構成することで、メタデータを発行できます。 便宜上、このコントラクトには"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 サンプル One-Time セットアップ手順を実行していることを確認します。

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

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