为 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>  

另请参阅