使用配置文件配置服务
通过使用配置文件配置 Windows Communication Foundation (WCF) 服务,可提供在部署时而非设计时提供终结点和服务行为数据的灵活性。 本主题概述了当前可用的主要技术。
WCF 服务可使用 .NET Framework 配置技术进行配置。 最常见的情况是,将 XML 元素添加到托管 WCF 服务的 Internet Information Services (IIS) 站点的 Web.config 文件。 通过这些元素,可以逐台计算机更改详细信息,例如终结点地址(用于与服务进行通信的实际地址)。 此外,WCF 包括几个系统提供的元素,可用于快速选择服务的最基本的功能。 从 .NET Framework 4 开始,WCF 将附带一个新的默认配置模型,该模型简化了 WCF 配置要求。 如果你没有为特定服务提供任何 WCF 配置,运行时将自动使用一些标准终结点和默认绑定/行为配置你的服务。 实际上,编写配置是 WCF 应用程序编程的主要部分。
有关详细信息,请参阅为服务配置绑定。 有关最常使用的元素的列表,请参阅系统提供的绑定。 有关默认终结点、绑定和行为的详细信息,请参阅简化配置和 WCF 服务的简化配置。
重要
在部署并行方案(其中部署了服务的两个不同版本)时,必须指定配置文件中引用的程序集的部分名称。 这是因为配置文件将在服务的所有版本间共享,并可在不同版本的 .NET Framework 下运行。
System.Configuration:Web.config 和 App.config
WCF 使用 .NET Framework 的 System.Configuration 配置系统。
在 Visual Studio 中配置服务时,使用 Web.config 文件或 App.config 文件指定设置。 配置文件名称的选择由为服务选择的宿主环境确定。 如果正在使用 IIS 来承载服务,则使用 Web.config 文件。 如果正在使用任何其他宿主环境,则使用 App.config 文件。
在 Visual Studio 中,名为 App.config 的文件可用于创建最终的配置文件。 实际用于配置的最终名称取决于程序集名称。 例如,名为“Cohowinery.exe”的程序集具有的最终配置文件名称为“Cohowinery.exe.config”。 但是,只需要修改 App.config 文件。 在编译时,对该文件所做的更改会自动应用于最终应用程序配置文件。
在使用 App.config 文件的过程中,当应用程序启动并应用配置时,文件配置系统会将 App.config 文件与 Machine.config 文件的内容合并。 此机制允许在 Machine.config 文件中定义计算机范围的设置。 可以使用 App.config 文件重写 Machine.config 文件的设置;也可以锁定 Machine.config 文件中的设置以应用它们。 对于 Web.config,配置系统会将应用程序目录之下的所有目录中的 Web.config 文件合并到要应用的配置中。 有关配置和设置优先级的更多信息,请参阅 System.Configuration 命名空间中的主题。
配置文件的主要部分
配置文件中的主要部分包括以下元素。
<system.ServiceModel>
<services>
<!-- Define the service endpoints. This section is optional in the new
default configuration model in .NET Framework 4. -->
<service>
<endpoint/>
</service>
</services>
<bindings>
<!-- Specify one or more of the system-provided binding elements,
for example, <basicHttpBinding> -->
<!-- Alternatively, <customBinding> elements. -->
<binding>
<!-- For example, a <BasicHttpBinding> element. -->
</binding>
</bindings>
<behaviors>
<!-- One or more of the system-provided or custom behavior elements. -->
<behavior>
<!-- For example, a <throttling> element. -->
</behavior>
</behaviors>
</system.ServiceModel>
注意
绑定部分和行为部分是可选的,只在需要时才包括。
<services> 元素
services
元素包含应用程序承载的所有服务的规范。 从 .NET Framework 4 中的简化配置模型开始,此部分是可选的。
<service> 元素
每个服务都具有以下属性:
name
。 指定提供服务协定的实现的类型。 这是完全限定名称,其中包含命名空间、句点和类型名称。 例如,"MyNameSpace.myServiceType"
。behaviorConfiguration
。 指定一个在behavior
元素中找到的behaviors
元素的名称。 指定的行为控制操作,例如服务是否允许模拟。 如果它的值是空的,或者未提供任何behaviorConfiguration
,则向服务中添加默认服务行为集。
<endpoint> 元素
每个终结点都需要以下属性表示的地址、绑定和协定:
address
。 指定服务的统一资源标识符 (URI),它可以是一个绝对地址,或是一个相对于服务基址给定的地址。 如果设置为空字符串,则指示在创建服务的 ServiceHost 时,终结点在指定的基址上可用。binding
。 通常,指定一个类似 WSHttpBinding的系统提供的绑定,但也可以指定一个用户定义的绑定。 指定的绑定确定传输协议类型、安全和使用的编码,以及是否支持或启用可靠会话、事务或流。bindingConfiguration
。 如果必须修改绑定的默认值,则可通过在binding
元素中配置相应的bindings
元素来执行此操作。 此属性应赋予与用于更改默认值的name
元素的binding
属性相同的值。 如果未提供任何名称,或者在绑定中未指定任何bindingConfiguration
,则在终结点中使用绑定类型的默认绑定。contract
。 指定定义协定的接口。 这是在由name
元素的service
属性指定的公共语言运行库 (CLR) 类型中实现的接口。
<bindings> 元素
bindings
元素包含可由任何服务中定义的任何终结点使用的所有绑定的规范。
<binding> 元素
在 binding
元素中包含的 bindings
元素可以是系统提供的绑定之一(请参阅 System-Provided Bindings),也可以是自定义绑定(请参阅 Custom Bindings)。 binding
元素具有 name
属性,此属性将绑定与 bindingConfiguration
元素的 endpoint
属性中指定的终结点相关联。 如果未指定任何名称,则该绑定对应于该绑定类型的默认值。
有关配置服务和客户端的详细信息,请参阅配置 WCF 服务。
<behaviors> 元素
这是定义服务行为的 behavior
元素的容器元素。
<behavior> 元素
每个 behavior
元素均由 name
属性进行标识,并提供系统提供的行为(例如 <throttling>
)或自定义行为。 如果未提供任何名称,则该行为元素对应于默认服务或终结点行为。
如何使用绑定和行为配置
在 WCF 中,通过在配置中使用引用系统,可以很方便地在终结点之间共享配置。 与绑定相关的配置值在 bindingConfiguration
部分的 <binding>
元素中进行分组,而不是直接将配置值分配到终结点。 绑定配置是一组命名的绑定设置。 然后,终结点可以通过名称来引用 bindingConfiguration
。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="myBindingConfiguration1" closeTimeout="00:01:00" />
<binding name="myBindingConfiguration2" closeTimeout="00:02:00" />
<binding closeTimeout="00:03:00" /> <!-- Default binding for basicHttpBinding -->
</basicHttpBinding>
</bindings>
<services>
<service name="MyNamespace.myServiceType">
<endpoint
address="myAddress" binding="basicHttpBinding"
bindingConfiguration="myBindingConfiguration1"
contract="MyContract" />
<endpoint
address="myAddress2" binding="basicHttpBinding"
bindingConfiguration="myBindingConfiguration2"
contract="MyContract" />
<endpoint
address="myAddress3" binding="basicHttpBinding"
contract="MyContract" />
</service>
</services>
</system.serviceModel>
</configuration>
在 name
元素中设置 bindingConfiguration
的 <binding>
。 name
必须是绑定类型(在本例中为 <basicHttpBinding>)范围中的唯一字符串,或者是引用默认绑定的空值。 通过将 bindingConfiguration
属性设置为此字符串,终结点链接到该配置。
以相同方式实现 behaviorConfiguration
,如以下示例中所示。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="myBehavior">
<callbackDebug includeExceptionDetailInFaults="true" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="NewServiceType">
<endpoint
address="myAddress3" behaviorConfiguration="myBehavior"
binding="basicHttpBinding"
contract="MyContract" />
</service>
</services>
</system.serviceModel>
</configuration>
请注意,向服务中添加了默认服务行为集。 此系统允许终结点共享公共配置而不用重新定义设置。 如果需要计算机范围的作用域,请在 Machine.config 中创建绑定或行为配置。配置设置在所有 App.config 文件中均可用。 通过 Configuration Editor Tool (SvcConfigEditor.exe) 可以很方便地创建配置。
行为合并
当您需要统一使用一组公共行为时,利用行为合并功能,可更加轻松地管理行为。 此功能允许您在配置层次结构的各个层上指定行为,并使服务能够从配置层次结构的多个层继承行为。 为了演示此功能的工作方式,假定您的 IIS 中包含以下虚拟目录布局:
~\Web.config~\Service.svc~\Child\Web.config~\Child\Service.svc
~\Web.config
文件包含以下内容:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
具有一个位于 ~\Child\Web.config 并包含以下内容的子 Web.config:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
位于 ~\Child\Service.svc 的服务的行为如同该服务具有 serviceDebug 和 serviceMetadata 行为一样。 位于 ~\Service.svc 的服务只具有 serviceDebug 行为。 发生的情况是,名称相同的两个行为集合(此情况下为空字符串)将合并。
也可使用 <clear> 标记来清除行为集合,使用 <remove> 标记从集合中移除各个行为。 例如,子服务中的以下两个配置结果只具有 serviceMetadata 行为:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<remove name="serviceDebug"/>
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<clear/>
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
对无名称行为集合执行行为合并(如上所示),并对命名行为集合执行行为合并。
行为合并适用于 IIS 宿主环境,其中 Web.config 文件与 Web.config 根文件和 machine.config 分层合并。但它也适用于应用程序环境,其中 machine.config 可以与 App.config 文件合并。
行为合并适用于配置中的终结点行为和服务行为。
如果子行为集合包含一个已显示在父行为集合中的行为,则子行为将重写父行为。 因此,如果父行为集合具有 <serviceMetadata httpGetEnabled="False" />
,而子行为集合具有 <serviceMetadata httpGetEnabled="True" />
,则子行为将重写行为集合中的父行为并且 httpGetEnabled 将为“true”。