共用方式為


元數據發佈行為

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

這很重要

為了清楚起見,此範例示範如何建立不安全的元數據發佈端點。 這類端點可能可供匿名未經驗證的取用者使用,而且在部署這類端點之前必須小心,以確保公開披露服務的元數據是適當的。 如需保護元數據端點的範例,請參閱 自定義安全元數據端點 範例。

此範例是以實作服務合約的 ICalculator 為基礎。 在此範例中,用戶端是控制台應用程式(.exe),而服務是由 Internet Information Services (IIS) 所裝載。

備註

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

若要讓服務公開元資料, 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 會用於服務的基位址,以存取元數據。 例如,若要在網頁瀏覽器中查看服務的 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 範例 中的指示。