创建应用程序时,通常需要在部署应用程序后将决策推迟给管理员。 例如,通常无法提前知道服务地址或统一资源标识符(URI)是什么。 最好允许管理员在创建服务后执行此作,而不是对地址进行硬编码。 这种灵活性是通过配置实现的。
注释
使用 ServiceModel 元数据实用工具工具(Svcutil.exe) 和 /config
开关快速创建配置文件。
主要部分
Windows Communication Foundation (WCF) 配置方案包含以下三个主要部分(serviceModel
和bindings
services
):
<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>