【51CTO精选译文】目前WCF用户最头痛的一件事就是需要为WCF服务处理众多的配置文件,WCF配置模式本身非常复杂,为用户操作增加了不少难度。在.Net 4中我们将为WCF用户干一件实事,简化WCF服务配置,为此我们将会在.Net 4中发布一系列新的WCF特性。
***个特性是不再需要为每个服务进行单独的配置,如果你没有为你的服务定义过任何< service>服务元素,你的服务也没有通过编程定义任何端点,那么将会自动向你的服务中添加一套端点,每个服务一个,每个服务执行的契约一个,这些端点的地址与基地址对应,绑定将由基地址模式和服务执行的契约决定。
下面的配置就是传统的WCF开发人员要编辑的WCF服务配置文件片段,在这个例子中,我们看到有一个基地址,执行了一个契约:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < services>
- < service name="Service1">
- < host>
- < baseAddresses>
- < add baseAddress="http://localhost:8731/Service1/" />
- < /baseAddresses>
- < /host>
- < endpoint address=""
- binding="basicHttpBinding"
- contract="Library1.IService1" />
- < /service>
- < /services>
- < /system.serviceModel>
- < /configuration>
但在.Net 4中,这个配置就被简化成:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < /configuration>
在这种情况下,即使没有配置文件,你也可以部署你的服务。在基地址模式和绑定类型之间也可以自定义映射,如果你想增强服务的安全性,可以为HTTP地址使用wsHttpBinding作为默认绑定类型,如:
- < protocolMapping>
- < add scheme="http" binding="wsHttpBinding" />
- < /protocolMapping>
第二个特性是允许用户为WCF绑定和行为定义默认值,那些没有名字的绑定、服务行为和端点行为可以应用到你没有进行明确配置的服务中,如果在VS2008/.NET 3.5中查看某个WCF服务库项目的配置,我们会看到:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < services>
- < service name="Service1"
- behaviorConfiguration="Service1Behavior">
- < host>
- < baseAddresses>
- < add baseAddress="http://localhost:8731/Service1/" />
- < /baseAddresses>
- < /host>
- < endpoint address=""
- binding="wsHttpBinding"
- contract="Library1.IService1" />
- < /service>
- < /services>
- < behaviors>
- < serviceBehaviors>
- < behavior name="Service1Behavior">
- < serviceMetadata httpGetEnabled="True" />
- < serviceDebug includeExceptionDetailInFaults="False" />
- < /behavior>
- < /serviceBehaviors>
- < /behaviors>
- < /system.serviceModel>
- < /configuration>
在.Net 4中新的WCF服务配置允许我们大大简化服务配置,如:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < behaviors>
- < serviceBehaviors>
- < behavior>
- < serviceMetadata httpGetEnabled="True" />
- < serviceDebug includeExceptionDetailInFaults="False" />
- < /behavior>
- < /serviceBehaviors>
- < /behaviors>
- < /system.serviceModel>
- < /configuration>
实际上,这恰好显示了VS2010/.NET 4中新的服务配置模板的模样。
定义默认的绑定和行为在.Net 4 WCF服务配置继承中非常有用,那些在配置层次***定义的绑定和行为将会自动添加到你的服务中,这就是传说中的配置继承。下图显示了如何依赖于机器和应用程序级定义的配置元素来简化你的服务配置。
在这个例子中,默认的basicHttpBinding和serviceMetadataBehavior都定义在物理层,在下一级定义了默认的serviceDebugBehavior,它将会添加服务上,只需默认端点使用了机器层定义的绑定即可。***要说明的是,.Net 4 Beta 2中这些默认服务行为将会被合并,并添加到那些没有明确配置的服务上,敬请期待!
***,.Net 4中第三个WCF配置增强是标准端点,它允许你定义可重复使用的预配置端点,这些端点的主要特性是有一到多个地址、绑定和有固定值的契约属性,这对于定义系统端点特别有用,系统端点提供它们自己的契约实施,例如不在你的服务中定义,作为MEX端点的实例,WCF开箱即可提供这个实现。标准端点的另一个有趣的特性是可以使用新的属性扩展服务端点,也可以使用类似的方式自定义绑定。标准端点也允许你为你的服务端点定义自定义属性。
为了定义标准端点,需要在你的端点中使用下面的属性。***个属性是kind,它标识了标准端点的类型,必须注册到< endpointExtensions>小节中,第二个属性是endpointConfiguration,它将去匹配< standardEndpoints>小节中标准端点的配置元素名,用于为端点定义新的属性,***一个属性是isSystemEndpoint,它标记端点确定它是否有一个固定的契约。
下面的配置代码片段定义了一个udpDiscoveryEndpoint,它是一个不明确的契约,为端点定义了额外的属性:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
- < system.serviceModel>
- < services>
- < service name="Service1">
- < endpoint address=""
- binding="basicHttpBinding"
- contract="Library1.IService1" />
- < endpoint kind="udpDiscoveryEndpoint"
- endpointConfiguration="udpConfig" />
- < /service>
- < /services>
- < standardEndpoints>
- < udpDiscoveryEndpoint>
- < standardEndpoint
- name="udpConfig"
- multicastAddress="soap.udp://239.255.255.250:3703"
- ... />
- < /udpDiscoveryEndpoint>
- < /standardEndpoints>
- < /system.serviceModel>
- < /configuration>
- < endpointExtensions>
小节将会在machine.config中具体指定:
- < ?xml version="1.0" encoding="utf-8" ?>
- < configuration>
接下来会怎样?
这些特性将帮助你维护一个清爽的WCF服务配置。不过还没结束!有时你可能想要为你的服务定义不同的配置,例如一个用于调试,一个用于部署,在这种情况下,你仍然要维护web.config文件。我们目前已经可以在定义的配置文件上工作,它将担任不同配置元素的元包,通过服务使用这个配置文件将它们导入进来。
原文:Service Configuration Improvements in .NET 4
作者:Amadeo Casas Cuadrado
【编辑推荐】