中繼資料發行行為

中繼資料範例會示範如何控制服務的中繼資料發行功能。 為了避免意外洩漏潛在的機密服務中繼資料,Windows Communication Foundation (WCF) 服務的預設設定會停用中繼資料發行。 此行為預設是安全的,但也表示您無法使用中繼資料匯入工具 (例如 Svcutil.exe) 來產生呼叫服務所需的用戶端程式代碼,除非在設定中明確啟用服務的中繼資料發行行為。

重要

為了清楚說明,這個範例示範如何建立不安全的中繼資料發行端點。 匿名未驗證的取用者可能會使用這類端點,而且必須在部署這類端點之前務必小心,以確保公開服務的中繼資料是適當的。 如需保護中繼資料端點的範例,請參閱 自訂安全中繼資料端點 範例。

此範例是以 執行服務合約的開始使用為基礎。 在這個範例中,用戶端是主控台應用程式 (.exe),而服務則是由網際網路資訊服務 (IIS) 所裝載。

注意

此範例的安裝程序與建置指示位於本主題的結尾。

為了讓服務公開中繼資料,服務上必須設定 ServiceMetadataBehavior。 當這個行為存在時,您便可以發行中繼資料,方法是將端點設定成將 IMetadataExchange 合約當做 WS-MetadataExchange (MEX) 通訊協定的實作來進行公開。 為了方便起見,這個合約已經被指定成縮寫組態名稱,"IMetadataExchange"。 這個範例會使用 mexHttpBinding,這個快捷標準繫結等同於安全性模式設為 wsHttpBindingNone。 端點中會使用 "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 會用於服務的基底位址上,以便存取中繼資料。 例如,若要在網頁瀏覽器中查看服務的 WSDL,您可以使用此位址 http://localhost/servicemodelsamples/service.svc?wsdl 。 此外,您可以將 HttpsGetEnabled 設定為 true,以便使用這個行為來透過 HTTPS 公開中繼資料。 這個作業需要 HTTPS 基底位址。

若要存取服務的 MEX 端點,請使用 [ System.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 合約設定的端點就不會有任何實作。

如果將 HttpGetEnabled 設定為 false,您就會看到 CalculatorService 說明網頁而不是服務的中繼資料。

若要安裝、建置及執行範例

  1. 確定您已針對 Windows Communication Foundation 範例執行一次性安裝程式

  2. 若要建置方案的 C# 或 Visual Basic .NET 版本,請遵循 Building the Windows Communication Foundation Samples中的指示。

  3. 若要在單一或跨電腦的設定中執行範例,請遵循執行Windows Communication Foundation 範例中的指示。