为 Windows Communication Foundation 服务配置绑定

创建应用程序时,通常需要在部署应用程序后将决策推迟给管理员。 例如,通常无法提前知道服务地址或统一资源标识符(URI)是什么。 最好允许管理员在创建服务后执行此作,而不是对地址进行硬编码。 这种灵活性是通过配置实现的。

注释

使用 ServiceModel 元数据实用工具工具(Svcutil.exe)/config 开关快速创建配置文件。

主要部分

Windows Communication Foundation (WCF) 配置方案包含以下三个主要部分(serviceModelbindingsservices):

<configuration>
    <system.serviceModel>
        <bindings>
        </bindings>
        <services>
        </services>
        <behaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

ServiceModel 元素

可以使用由 system.ServiceModel 元素限定的部分来配置具有一个或多个终结点的服务类型,以及服务的相关设置。 然后,可以使用地址、协定和绑定来配置每个终结点。 有关终结点的详细信息,请参阅 终结点创建概述。 如果未指定任何终结点,运行时将添加默认终结点。 有关默认终结点、绑定和行为的详细信息,请参阅 WCF 服务的 简化配置简化配置

绑定指定传输(HTTP、TCP、管道、消息队列)和协议(安全性、可靠性、事务流),并包含绑定元素,每个元素都指定终结点如何与世界通信的一个方面。

例如,指定 <basicHttpBinding> 元素指示使用 HTTP 作为终结点的传输。 打开使用此终结点的服务时,此终结点用于在运行时连接终结点。

有两种类型的绑定:预定义绑定和自定义绑定。 预定义绑定包含常见方案中使用的元素的有用组合。 有关 WCF 提供的预定义绑定类型的列表,请参阅 System-Provided 绑定。 如果没有预定义绑定集合具有服务应用程序所需的功能的正确组合,则可以构造自定义绑定以满足应用程序的要求。 有关自定义绑定的详细信息,请参阅 <customBinding>

以下四个示例演示了用于设置 WCF 服务的最常见绑定配置。

指定终结点以使用绑定类型

第一个示例说明如何指定一个配置了地址、协定和绑定的终结点。

<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
  <!-- This section is optional with the default configuration introduced
       in .NET Framework 4. -->
  <endpoint
      address="/HelloWorld2/"
      contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
      binding="basicHttpBinding" />
</service>

在此示例中,该 name 属性指示配置所针对的服务类型。 使用 HelloWorld 协定在代码中创建服务时,它将使用示例配置中定义的所有终结点进行初始化。 如果程序集仅实现一个服务协定,则可以省略该 name 属性,因为该服务使用唯一的可用类型。 该属性采用字符串,该字符串必须采用格式 Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

address 属性指定其他终结点用于与服务通信的 URI。 URI 可以是绝对路径或相对路径。 如果提供了相对地址,则主机应提供适用于绑定中使用的传输方案的基址。 如果未配置地址,则假定基址是该终结点的地址。

contract 属性指定了此终结点所暴露的协定。 服务实现类型必须实现协定类型。 如果服务实现实现单个协定类型,则可以省略此属性。

binding 属性选择要用于此特定终结点的预定义或自定义绑定。 未显式选择绑定的终结点使用默认绑定选择,即 BasicHttpBinding

修改预定义绑定

在以下示例中,修改了预定义绑定。 然后,它可用于配置服务中的任何终结点。 通过将 ReceiveTimeout 值设置为 1 秒,修改绑定。 请注意,该属性返回一个 TimeSpan 对象。

在绑定部分中可以找到该更改的绑定。 通过在 binding 元素中设置 endpoint 属性,现在可以在创建任何终结点时使用这个已更改的绑定。

注释

如果为绑定指定特定名称,则 bindingConfiguration 服务终结点中指定的名称必须与它匹配。

<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
  <endpoint
      address="/HelloWorld2/"
      contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
      binding="basicHttpBinding" />
</service>
<bindings>
    <basicHttpBinding
        receiveTimeout="00:00:01"
    />
</bindings>

配置要应用于服务的行为

在以下示例中,为服务类型配置了特定行为。 该 ServiceMetadataBehavior 元素用于启用 ServiceModel 元数据实用工具工具(Svcutil.exe), 以查询服务并从元数据生成 Web 服务描述语言(WSDL)文档。

注释

如果为行为指定了特定名称,则 behaviorConfiguration 服务或终结点部分中指定的名称必须与它匹配。

<behaviors>
    <behavior>
        <ServiceMetadata httpGetEnabled="true" />
    </behavior>
</behaviors>
<services>
    <service
       name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
       <endpoint
          address="http://computer:8080/Hello"
          contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
          binding="basicHttpBinding" />
    </service>
</services>

上述配置使客户端能够调用并获取“HelloWorld”类型服务的元数据。

svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl

使用不同的绑定值指定具有两个终结点的服务

在此最后一个示例中,为服务类型配置了两个 HelloWorld 终结点。 每个终结点使用同一种绑定类型的不同自定义 bindingConfiguration 属性(这些都修改了 basicHttpBinding 属性)。

<service name="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
    <endpoint
        address="http://computer:8080/Hello1"
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        binding="basicHttpBinding"
        bindingConfiguration="shortTimeout" />
    <endpoint
        address="http://computer:8080/Hello2"
        contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
        binding="basicHttpBinding"
        bindingConfiguration="Secure" />
</service>
<bindings>
    <basicHttpBinding
        name="shortTimeout"
        timeout="00:00:00:01"
     />
     <basicHttpBinding
        name="Secure">
        <Security mode="Transport" />
     </basicHttpBinding>
</bindings>

可以通过添加一个 protocolMapping 节内容并配置绑定来实现与默认配置相同的行为,如下面的示例所示。

<protocolMapping>
    <add scheme="http" binding="basicHttpBinding" bindingConfiguration="shortTimeout" />
    <add scheme="https" binding="basicHttpBinding" bindingConfiguration="Secure" />
</protocolMapping>
<bindings>
    <basicHttpBinding
        name="shortTimeout"
        timeout="00:00:00:01"
     />
     <basicHttpBinding
        name="Secure" />
        <Security mode="Transport" />
</bindings>

另请参阅