WCF 配置文件

      每一个 WCF 服务都会关系到地址(Address)、绑定(Binding)和契约(Contract),而 WCF 则通过 Endpoint 将 ABC 三个方面联系在一起。每一个 Endpoint 都必须包括 ABC 三个方面,缺一不可,而 host 进程会提供 Endpoint 供客户端调用。每个 Endpoint 都对应一个唯一地址,但是多个 Endpoint 可以共享相同的绑定和契约,每个服务又可以提供多个 Endpoint 供客户端掉用。

 

WCF配置文件共分为两部分:服务端配置与客户端配置。两者由于功能的不同,在配置文件的使用上也略有不同。

1.WCF配置文件的服务端配置

服务端的配置文件主要包括endpoint、binding、behavior的配置。一个标准的服务端配置文件所包含的主要xml配置节如下所示:

  1. < system.ServiceModel> < services>
  2. < service> < endpoint/>
  3. < /service> < /services>
  4. < bindings> < !—定义一个或多个系统提供的binding元素,例如< basicHttpBinding> -->
  5. < !—也可以是自定义的binding元素,如< customBinding>. --> < binding>
  6. < !—例如< BasicHttpBinding>元素. --> < /binding>
  7. < /bindings> < behaviors>
  8. < !—一个或多个系统提供的behavior元素. --> < behavior>
  9. < !—例如< throttling>元素. --> < /behavior>
  10. < /behaviors> < /system.ServiceModel>

1.1 < services>配置节

在< services>配置节中可以定义多个服务,每一个服务都被放到< service>配置节中,WCF的宿主程序可以通过WCF配置文件找到这些定义的服务并发布这些服务。

< service>配置节包含name和behaviorConfiguration属性。其中,name配置了实现Service Contract的类型名。类型名必须是完整地包含了命名空间和类型名。而behaviorConfiguration的配置值则与其后的< behaviors>配置节的内容有关。< endpoint>是< service>配置节的主体,其中,< endpoint>配置节包含了endpoint的三个组成部分:Address、Binding和Contract。由于具体的binding配置是在< bindings>配置节中完成,因而,在< endpoint>中配置了bindingConfiguration属性,指向具体的binding配置。如下所示:

  1. < services> < service name="BruceZhang.MyService"
    behaviorConfiguration="MyBehavior">
  2. < endpoint address="" binding="netTcpBinding"
  3. bindingConfiguration="DuplexBinding" contract="BruceZhang.IHello" />
  4. < /service> < /services>

 

我们也可以定义多个endpoint,例如:

  1. < services> < service
  2. name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior">
  3. < endpoint address="" binding="wsHttpBinding"
  4. contract="Microsoft.ServiceModel.Samples.ICalculator" /> < endpoint address="mex"
  5. binding="mexHttpBinding" contract=" Microsoft.ServiceModel.Samples.IMetadataExchange" />
  6. < /service> < /services>

 

如果address值为空,那么endpoint的地址就是默认的基地址(Base Address)。例如ICalculator服务的地址就是http://localhost/servicemodelsamples/service.svc,而IMetadataExchange服务的地址则为http://localhost/servicemodelsamples/service.svc/mex。这里所谓的基地址可以在< service>中通过配置< host>来定义:

  1. < service name="Microsoft.ServiceModel.Samples.CalculatorService"
  2. behaviorConfiguration="CalculatorServiceBehavior"> < host>
  3. < baseAddresses> < add baseAddress=
  4. "http://localhost/ServiceModelSamples/service.svc"/> < /baseAddresses>
  5. < /host> < endpoint/>
  6. < /service>

 

1.2 < behaviors>配置节

当我们在定义一个实现了Service Contract的类时, binding和address信息是客户端必须知道的,否则无法调用该服务。然而,如果需要指定服务在执行方面的相关特性时,就必须定义服务的behavior。在WCF中,定义behavior就可以设置服务的运行时属性,甚至于通过自定义behavior插入一些自定义类型。例如通过指定ServiceMetadataBehavior,可以使WCF服务对外公布Metadata。配置如下:

  1. < behaviors> < serviceBehaviors>
  2. < behavior name="metadataSupport"> < serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
  3. < /behavior> < serviceBehaviors>
  4. < behaviors>

 

在WCF中,behavior被定义为Attribute,其中,System.ServiceModel.ServiceBehaviorAttribute和System.ServiceModel.OperationBehaviorAttribute是最常用的behavior。虽然,behavior作为Attribute可以通过编程的方式直接施加到服务上,但出于灵活性的考虑,将behavior定义到WCF配置文件中才是最好的设计方式。

利用ServiceBehavior与OperationBehavior可以控制服务的如下属性:

  1. 1、 对象实例的生命周期; 2、 并发与异步处理;
  2. 3、 配置行为; 4、 事务行为;
  3. 5、 序列化行为; 6、 元数据转换;
  4. 7、 会话的生命周期; 8、 地址过滤以及消息头的处理;
  5. 9、 模拟(Impersonation);

 

例如,通过ServiceBehavior设置对象实例的生命周期:

  1. < behaviors> < serviceBehaviors>
  2. < behavior name="metadataSupport"> < instanceContextMode httpGetEnabled="true" httpGetUrl=""/>
  3. < /behavior> < serviceBehaviors>
  4. < behaviors>

 

 

posted @ 2012-04-28 00:40  zhh  阅读(415)  评论(0编辑  收藏  举报