为 Windows Communication Foundation 服务配置绑定
创建应用程序时,您经常需要将一些决策交给管理员在部署应用程序后制定。例如,通常没有办法提前知道服务地址或统一资源标识符 (URI)。最好允许管理员在创建服务后指定地址,而不是对地址进行硬编码。这种灵活性是通过配置实现的。
提示
使用带有 /config 开关的 ServiceModel Metadata Utility Tool (Svcutil.exe) 可以迅速创建配置文件。
主要部分
Windows Communication Foundation (WCF) 配置架构包括下面三个主要部分(serviceModel、bindings 和 services):
<configuration>
<system.serviceModel>
<bindings>
</bindings>
<services>
</services>
<behaviors>
</behaviors>
</system.serviceModel>
</configuration>
ServiceModel 元素
您可以使用 system.ServiceModel 元素所界定的部分来配置具有一个或多个终结点的服务类型以及服务的设置。之后,可以为每个终结点配置地址、协定以及绑定。有关 终结点的更多信息,请参见终结点创建概述。
绑定指定传输(HTTP、TCP、管道、消息队列)和协议(安全性、可靠性、事务流)。绑定由绑定元素组成,其中的每个元素都指定终结点与世界的通信方式的一个方面。
例如,指定 basicHttpBinding 元素表示将 HTTP 用作终结点的传输。这用于在使用此终结点的服务打开时在运行时连接终结点。
有两种绑定:预定义绑定和自定义绑定。预定义绑定包含在常见方案中使用的元素的有用组合。有关 WCF 提供的预定义绑定类型的列表,请参见系统提供的绑定。如果没有任何预定义绑定集合具有服务应用程序所需的功能的正确组合,那么您可以构建自定义绑定来满足应用程序的需求。有关 自定义绑定的更多信息,请参见 <customBinding>。
下面四个示例说明了用于设置 WCF 服务的最常见绑定配置。
指定一个终结点来使用绑定类型
第一个示例说明如何指定一个配置了地址、协定和绑定的终结点。
<service type="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" />
</endpoint>
</service>
在本示例中,type 属性表示使用该配置的服务类型。当您用 HelloWorld
协定通过代码中创建服务时,它将以示例配置中定义的所有终结点进行初始化。如果程序集仅实现一个服务协定,则 type 属性可以省略,因为服务使用唯一可用的类型。该属性采用字符串,该字符串必须遵循以下格式:Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
address 属性指定其他终结点用于与该服务通信的 URI。该 URI 可以是绝对路径,也可以是相对路径。如果提供的是相对地址,则需要主机提供适合于绑定中所使用的传输方案的基址。如果未配置地址,则假定基址为该终结点的地址。
contract 属性指定该终结点所公开的协定。服务实现类型必须实现该协定类型。如果服务实现所实现的是单个协定类型,则可以省略此属性。
binding 属性选择要用于此特定终结点的预定义或自定义绑定。不显式选择绑定的终结点使用默认绑定选择,即 BasicHttpBinding。
修改预定义绑定
在下面的示例中,将修改并命名一个预定义绑定。然后可以将该绑定用于配置服务中的任意终结点。可通过将 ReceiveTimeout 值设置为 1 秒的方式来修改绑定。请注意,该属性返回一个 TimeSpan 对象。
修改后的绑定可以在绑定部分找到,该修改后的绑定指定有一个唯一的名称 shortTimeout
,该名称由 name 属性设置。现在,当通过将 endpoint 元素中的 binding 属性设置为该唯一名称来创建任意终结点时,可以使用这一修改后的绑定。这样,您就可以有数量几乎无限制的标准绑定的变体。
提示
如果您不创建标准绑定的任何变体,则不需要将 bindingConfiguration 属性设置为任何值。在这种情况下,将使用未修改的预定义绑定。
<service type="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" />
</endpoint>
</service>
<bindings>
<basicHttpBinding
name="shortTimeout"
receiveTimeout="00:00:01"
/>
</bindings>
配置一个要应用于服务的行为
在下面的示例中,为该服务类型配置了一个特定的行为。metadataPublishing 元素用于使 ServiceModel Metadata Utility Tool (Svcutil.exe) 可以查询服务并基于元数据生成 Web Services 描述语言 (WSDL) 文档。
<behaviors>
<behavior name="MetaPlusExceptions" >
<metadataPublishing enableGetWsdl="true" />
</behavior>
</behaviors>
<services>
<service
type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
serviceBehaviorName="MetaPlusExceptions">
<endpoint
address="http://computer:8080/Hello"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding" />
</endpoint>
</service>
</services>
前面的配置可供客户端调用
svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl
并获得“HelloWorld”类型服务的元数据。
使用不同的绑定值指定具有两个终结点的服务
这是最后一个示例,在本示例中,为 Hello
服务类型配置了两个终结点。每个终结点都使用同一绑定类型的一个不同的自定义 bindingConfiguration 属性(每个属性都修改 basicHttpBinding)。
<service type="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"
bindingConfiguration="shortTimeout"
</endpoint>
<endpoint
address="http://computer:8080/Hello"
contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"
binding="basicHttpBinding"
bindingConfiguration="Secure"
</endpoint>
</service>
<bindings>
<basicHttpBinding
name="shortTimeout"
timeout="00:00:00:01"
/>
<basicHttpBinding
name="Secure" />
<Security mode="Transport" />
</bindings>