[WCF 4.0新特性] 默认绑定和行为配置

对于传统的WCF配置系统,无论是绑定的配置还是行为(服务行为和终结点行为)都必须具有一个名称。而正是通过整个配置名称,它们才能被应用到目标对象(终结点或者服务)上。而在实际的项目开发中,绝大部分服务或者终结点都具有相同的绑定和行为,如果能够定义一种默认的绑定和行为,这无疑会简化我们的配置。WCF4.0为此提供了一个新的特性以支持默认绑定和行为的配置。

一、 默认绑定配置

在传统的配置方式下,如果我们需要对终结点的绑定(不论是系统绑定还是自定义绑定)进行定制,我们都需要配置一个“具名”的绑定,然后将这个名称指定为终结点配置节的bindingConfiguration属性进而将绑定配置应用到终结点绑定上。

比如说我需要采用WS2007HttpBinding作为终结点绑定,并且需要采用Message安全模式和用户名密码认证,我需要按照下面XML片断所示的方式进行配置。首先需要在<bindings>/<ws2007HttpBinding>结点下定义一个具体的WS2007HttpBinding,除了进行我们所需的安全相关配置之外,这个配置的绑定必须具有一个名字(defaultBinding)。然后将绑定的配置名称指定为终结点的配置属性bindingConfiguration,这就意味着终结点采用了配置的绑定。

   1: <?xml version="1.0"?>
   2: <configuration>
   3:   <system.serviceModel>      
   4:     <bindings>
   5:       <ws2007HttpBinding>
   6:         <binding name="defaultBinding">
   7:           <security mode="Message">
   8:             <message clientCredentialType="UserName" />
   9:           </security>
  10:         </binding>
  11:       </ws2007HttpBinding>
  12:     </bindings>
  13:     <services>
  14:       <service name="Artech.NewFeaturesInWcf4.Service.CalculatorService">
  15:         <endpoint address="http://127.0.0.1:3721/calculatorservice" binding="ws2007HttpBinding"
  16:           bindingConfiguration="defaultBinding" contract="Artech.NewFeaturesInWcf4.Contract.ICalculator" />
  17:       </service>
  18:     </services>
  19:   </system.serviceModel>
  20: </configuration>

也就是说,对于WCF传统的配置系统,并不存在一个“默认绑定”的概念。或者说所谓的“默认绑定”就是所有属性值均采用默认值的绑定,我们并不能显式地设置一个默认绑定。但是在具体的开发场景中,这样的需求是很常见的,因为在同一个应用里面绝大部分采用的绑定都具有相同的配置。为了解决这样的问题,最新的WCF支持对于默认绑定的配置。

在最新的WCF中,配置的绑定具有两种类型,一种是传统的具名绑定,也就是需要显式指定一个名称。另一种叫做默认绑定,默认绑定不要指定名称。对于上面给出的针对WSHttpBinding的配置,如果我们将其配置属性name去掉,它就成为了一个默认的绑定。对于所有将WSHttpBinding作为绑定的终结点,如果并没有对bindingConfiguration配置属性进行显式设置,这个默认绑定的所有配置就自动应用到了这些终结点的绑定上。

   1: <?xml version="1.0"?>
   2: <configuration>
   3:   <system.serviceModel>      
   4:     <bindings>
   5:       <ws2007HttpBinding>
   6:         <binding>
   7:           <security mode="Message">
   8:             <message clientCredentialType="UserName" />
   9:           </security>
  10:         </binding>
  11:       </ws2007HttpBinding>
  12: </bindings>
  13: ...
  14: </configuration>

二、默认行为配置

默认行为配置和默认绑定配置的作用类似,它允许我们在配置中定义不具名的服务行为或者终结点行为。不过在介绍默认行为配置之前,我们还是来介绍传统的服务行为和终结点行为采用怎样的配置方式。

在传统的配置系统下,无论是服务行为还是终结点行为,我们都必须为之指定一个名称。而服务和终结点的配置节都具有一个behaviorConfiguration配置属性,该属性用以设置配置的行为名称。正是通过这么一个配置属性,配置的服务行为能够应用到目标服务上,而目标终结点也能够使用配置的终结点行为。

比如在下面的一段配置中,我们配置两个名称为defaultBehavior的行为。其中一个为终结点行为,它实际上应用了ServiceDebugBehavior行为并将IncludeExceptionDetailInFaults设置为True,这样可以使服务端抛出的异常的详细信息通过错误消息传播到客户端以利于查错和纠错。另一个为服务行为,该行为将默认使用的DataContractSerializer的MaxItemsInObjectGraph属性设置为最大值,以实现对大数据对象序列化和反序列化。这两个行为最终被分别应用到了寄宿的CalculatorService服务以及它的终结点上。

   1: <?xml version="1.0"?>
   2: <configuration>
   3:   <system.serviceModel>
   4:     <behaviors>
   5:       <endpointBehaviors>
   6:         <behavior name="defaultBehavior">
   7:           <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
   8:         </behavior>
   9:       </endpointBehaviors>
  10:       <serviceBehaviors>
  11:         <behavior name="defaultBehavior">
  12:           <serviceDebug includeExceptionDetailInFaults="true"/>
  13:         </behavior>
  14:       </serviceBehaviors>
  15:     </behaviors>    
  16:     <services>
  17:       <service name="Artech.NewFeaturesInWcf4.Service.CalculatorService" behaviorConfiguration="defaultBehavior">
  18:         <endpoint address="http://127.0.0.1:3721/calculatorservice" binding="ws2007HttpBinding"
  19:            contract="Artech.NewFeaturesInWcf4.Contract.ICalculator" behaviorConfiguration="defaultBehavior" />
  20:       </service>
  21:     </services>
  22:   </system.serviceModel>
  23: </configuration>

如果我们需要将这两个行为定义成默认的服务行为和终结点行为,我们只需像下面给出的配置一样将它们的name属性去掉。在这种情况下,对于该配置作用范围内配置的所有服务和终结点,如果并没有对其behaviorConfiguration进行显式设置,它们将具有对应的默认行为。

   1: <?xml version="1.0"?>
   2: <configuration>
   3:   <system.serviceModel>
   4:     <behaviors>
   5:       <endpointBehaviors>
   6:         <behavior>
   7:           <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
   8:         </behavior>
   9:       </endpointBehaviors>
  10:       <serviceBehaviors>
  11:         <behavior>
  12:           <serviceDebug includeExceptionDetailInFaults="true"/>
  13:         </behavior>
  14:       </serviceBehaviors>
  15:     </behaviors>    
  16:     ...
  17:   </system.serviceModel>
  18: </configuration>

默认行为配置具有一个默认绑定配置所不具有的属性,那就是配置的继承性。我们举个简单的例子来说明默认行为配置的继承性所致为何。假设我创建一个如下图所示结构的用于服务寄宿(IIS寄宿)的Web项目。为了对.svc文件进行结构化的管理,我们对其进行分类,并将同类的.svc文件至于相同的子目录下。在本例中,我们建立了一个Erp的子目录用于存放所有关于ERP相关服务的.svc文件,在这里仅仅具有一个唯一的基于订单服务的OrderService.svc。

读者应该注意到了,在Web项目的根据和子目录Erp中均定义了一个Web.config。这也是很常用并且我个人推荐的配置方式:将公共的配置定义在外层的Web.config中,而子目录下Web.config用于定义在该目录下所有.svc文件对应的服务的配置。现在假设两个Web.config分别具有如下的配置。

WcfServices\Web.config:

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:     <system.serviceModel>
   4:         <behaviors>
   5:             <serviceBehaviors>
   6:                 <behavior>
   7:                     <dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="65536" />
   8:                     <serviceDebug includeExceptionDetailInFaults="true" />
   9:                 </behavior>
  10:             </serviceBehaviors>
  11:         </behaviors>
  12:     </system.serviceModel>
  13: </configuration>

WcfServices\Erp\Web.config:

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:     <system.serviceModel>
   4:         <behaviors>
   5:             <serviceBehaviors>
   6:                 <behavior>
   7:                     <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   8:                     <serviceTimeouts transactionTimeout="00:01:00" />
   9:                 </behavior>
  10:             </serviceBehaviors>
  11:         </behaviors>
  12:         <services>
  13:             <service name="Artech.WcfServices.Service.OrderService">
  14:                 <endpoint binding="ws2007HttpBinding" contract="Artech.WcfServices.Contract.IOrderService" />
  15:             </service>
  16:         </services>
  17:     </system.serviceModel>
  18: </configuration>

从上面给出的两段配置我们可以看到,两个配置文件中均定义了默认的服务行为。那么对于基于OrderService.svc的服务OrderService来说,它具有怎样的服务行为呢?实际上,定义在根目录下Web.config的默认服务行为会自动被子目录\Erp所继承,所以OrderService具有的服务行为是两者的“合并”,它具有的默认服务行为和下面的配置等效。我们将定义在上级目录下默认行为配置被下级目录继承的特性称为默认行为配置的继承性。同理,所有没有显式设置具名行为的服务和终结点均会继承定义在machine.config中的默认行为。

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:     <system.serviceModel>
   4:         <behaviors>
   5:             <serviceBehaviors>
   6:                 <behavior>
   7:                     <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   8:                     <serviceTimeouts transactionTimeout="00:01:00" />
   9:                     <serviceDebug includeExceptionDetailInFaults="true" />
  10:                 </behavior>
  11:             </serviceBehaviors>
  12:         </behaviors>
  13:         ...
  14:     </system.serviceModel>
  15: </configuration>

[WCF 4.0新特性] 默认终结点 [WCF 4.0新特性] 默认绑定和行为配置

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏极客生活

数据分析Excel之去重

默认是所有列对比,也就是将所有列看成一个元组,全都相同才算重复。 比如上图中,由于「全选」,只有一个重复值就是20行和21行,点击「删除重复项」即可。

731
来自专栏FreeBuf

Altdns:运用置换扫描技术的子域发现工具

Altdns是一款运用置换扫描技术的子域发现工具,它可以帮助我们查找与某些排列或替换匹配的子域。AltDNS接受可能存在于域下的子域中的单词(例如测试,开发,分...

2267
来自专栏代码世界

23种设计模式之单例模式

单例模式    单例模式(Singleton Pattern)是一个比较简单的模式,其定义为:Ensure a class has only one insta...

33714
来自专栏机器学习从入门到成神

Spring使用p名称空间配置属性

Spring的p标签是基于XML Schema的配置方式,目的是为了简化配置方式。

1221
来自专栏Golang语言社区

Golang语言--select

Golang语言--select golang的select与channel配合使用。它用于等待一个或者多个channel的输出。 应用场景:主goroutin...

3447
来自专栏ImportSource

厕读:每日一题,面试无忧

9. volatile关键字是否能保证线程安全?() 答案:不能 解析:volatile关键字用在多线程同步中,可保证读取的可见性,JVM只是保证从主内存加载到...

32910
来自专栏菩提树下的杨过

进程与线程

一般来讲,当启动一个应用程序时,系统里就生成了一个进程, 这个进程拥有自己的内存空间。(我们平时用windows的任务管理器看到的也就是进程) 但也有特殊:比如...

19410
来自专栏抠抠空间

Linux文件操作相关命令

1600
来自专栏大数据

scrapy如何顺序执行多个爬虫

scrapy如何单线程顺序执行多个爬虫,刚开始我天真的以为将多个excute顺序罗列就能依次执行每个爬虫了,代码如下所示: ? 谁料,在执行完第一个爬虫之后,...

54410
来自专栏王二麻子IT技术交流园地

CentOS yum安装Apache + PHP + Tomcat7 + MySQL

可以参考下文在CentOS安装Apache + PHP + Tomcat7 + MySQL。 ---------------------------------...

6775

扫码关注云+社区