元数据发布行为

元数据示例演示如何控制服务的元数据发布功能。 为防止意外泄露潜在的敏感服务元数据,Windows Communication Foundation (WCF) 服务的默认配置会禁用元数据发布。 默认情况下,此行为是安全的,但也意味着不能使用元数据导入工具(如 Svcutil.exe)生成调用服务所需的客户端代码,除非在配置中显式启用服务的元数据发布行为。

重要

为了清楚起见,此示例演示如何创建不安全的元数据发布终结点。 此类终结点可能可供匿名未经身份验证的使用者使用,在部署此类终结点之前必须小心,以确保公开披露服务的元数据是适当的。 有关保护元数据终结点的示例,请参阅 自定义安全元数据终结点 示例。

此示例基于名为Getting Started的指南,并实现ICalculator服务协定。 在此示例中,客户端是一个控制台应用程序 (.exe),服务是由 Internet 信息服务 (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 用于服务基址以访问元数据。 例如,若要在 Web 浏览器中查看服务的 WSDL,请使用该地址 http://localhost/servicemodelsamples/service.svc?wsdl。 或者,您可以通过将 HttpsGetEnabled 设置为 true 来使用此行为通过 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 协定配置的终结点则没有实现。

如果将HttpGetEnabled设置为false,则会看到“CalculatorService”帮助页,而不是服务的元数据。

设置、生成和运行示例

  1. 确保已为 Windows Communication Foundation 示例 执行One-Time 安装过程。

  2. 若要生成解决方案的 C# 或 Visual Basic .NET 版本,请按照 生成 Windows Communication Foundation 示例中的说明进行操作。

  3. 若要在单台计算机或跨计算机配置中运行示例,请按照 运行 Windows Communication Foundation 示例中的说明进行操作。