说起WCF,不得不说说他的配置。也许配置才是WCF中最重要的,最难的。各种节点,各种属性。尼玛全部都是各种来的,痛苦啊!
我以前问过一位前辈:“学习WCF,那配置文件的配置是不是很难很难”。他说:“没有,其实很简单,VS2010有配置工具,直接点啊点的就出来了”
晕了.......看了徐长龙的WCF视频,对配置方面做个笔记吧。也属于学习中的一个标记。哈哈。
WCF中配置文件一般分两种:
1:Web.config————由IIS承载的WCF服务。
2:App.config————其他宿主承载WCF服务(控制台,窗体,服务类型等。在Artech大神的WCF系列文章中就可以看到很多控制台承载WCF的例子)。
配置中一般就三个最重要的同级节点
<services>:开多个服务,服务下面终结点。(三个中只有这个是必须得配置的,其他两个都是可选的!)
<bindings>:同样有很多中绑定。
<behaviors>:行为。
一:services。
配置的每一条元素都有以下属性。Name指定服务协定的实现的类型。完全限定名称(命名空间和类型名称) behaviorConfiguration指定一个在behaviors元素中找到behavior元素名称,指定的行为控制操作。
endpoint:每个终结点都需要以下属性表示的地址、绑定和协定:
– address 。指定服务的统一资源标识符(URI) ,它可以是一个绝对地址或是一个相对于服务基址给定的地址 如果设置为空字符 地址,或是一个相对于服务基址给定的地址。如果设置为空字符串,则指示在创建服务的ServiceHost 时,终结点在指定的基址上可用。
– binding。通常,指定一个类似WsHttpBinding的系统提供的绑定,但也可以指定一个用户定义的绑定。指定的绑定确定传输协议类型、安全和使用的编码,以及是否支持或启用可靠会话、事务或 型、安全和使用的编码,以及是否支持或启用可靠会话、事务或流。
– bindingConfiguration。如果必须修改绑定的默认值,则可通过在bindings 元素中配置相应的binding元素来执行此操作 此属性 bindings 元素中配置相应的binding 元素来执行此操作。此属性应赋予与用于更改默认值的binding 元素的name 属性相同的值。– contract 。指定定义协定的接口。这是在由service 元素的name
属性指定的公共语言运行库(CLR) 类型中实现的接口。
在<services>配置节中可以定义多个服务,每一个服务都被放到<service>配置节中,WCF的宿主程序可以通过配置文件找到这些定义的服务并发布这些服务。
<service>配置节包含name和behaviorConfiguration属性。其中,name配置了实现Service Contract的类型名。类型名必须是完整地包含了命名空间和类型名。而behaviorConfiguration的配置值则与其后的<behaviors>配置节的内容有关。<endpoint>是<service>配置节的主体,其中,<endpoint>配置节包含了endpoint的三个组成部分:Address、Binding和Contract。由于具体的binding配置是在<bindings>配置节中完成,因而,在<endpoint>中配置了bindingConfiguration属性,指向具体的binding配置。
<endpoint address="" binding="wsDualHttpBinding" contract="WcfDuplex.IService1"> contract="WcfDuplex.IService1" 就是命名空间加上接口 address空 就是指定到中的BassAddress了。
binding元素:
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <system.serviceModel> 4 <bindings> 5 <basicHttpBinding> 6 <binding name="myBindingConfiguration1" closeTimeout="00:01:00" /> 7 <binding name= " myBindingConfiguration2" closeTimeout=" 00:02:00 " /> <binding name= myBindingConfiguration2 closeTimeout= 00:02:00 /> 8 </basicHttpBinding> 9 </bindings> 10 <services> 11 <service name="myServiceType"> 12 <endpoint 13 address="myAddress" binding="basicHttpBinding" 14 bindingConfiguration=" myBindingConfiguration1" /> bindingConfiguration= myBindingConfiguration1 /> 15 </service> 16 </services> 17 </system.serviceModel> 18 </configuration>
我们endpoint节点舒心binding只的就是上面bindings下面的basicHttpBindingbindingConfiguration指定的就是里面的子节点<binding>
behaviors 元素:
1 <?xml version="1 0" encoding="utf 8"?> <?xml version="1.0" encoding="utf - 8"?> 2 <configuration> 3 <system.serviceModel> 4 <behaviors> 5 <endpointBehaviors> 6 <behavior name="myBehavior"> 7 <callbackDebug includeExceptionDetailInFaults="true" /> 8 </behavior> 9 </endpointBehaviors> 10 </behaviors> 11 <services> 12 <service name="NewServiceType"> 13 <endpoint 14 address="myAddress" behaviorConfiguration="myBehavior" 15 binding=" basicHttpBinding" /> binding= basicHttpBinding /> 16 </service> 17 </services> 18 </system.serviceModel> y 19 </configuration>
behaviorConfiguration指定的也是behaviors中的behavior元素。 当我们在定义一个实现了Service Contract的类时, binding和address信息是客户端必须知道的,否则无法调用该服务。然而,如果需要指定服务在执行方面的相关特性时,就必须定义服务的behavior。在WCF中,定义behavior就可以设置服务的运行时属性,甚至于通过自定义behavior插入一些自定义类型。例如通过指定ServiceMetadataBehavior,可以使WCF服务对外公布Metadata。在WCF中,behavior被定义为Attribute,其中,System.ServiceModel.ServiceBehaviorAttribute和System.ServiceModel.OperationBehaviorAttribute是最常用的behavior。虽然,behavior作为Attribute可以通过编程的方式直接施加到服务上,但出于灵活性的考虑,将behavior定义到配置文件中才是最好的设计方式。
利用ServiceBehavior与OperationBehavior可以控制服务的如下属性:
1、 对象实例的生命周期;
2、 并发与异步处理;
3、 配置行为;
4、 事务行为;
5、 序列化行为;
6、 元数据转换;
7、 会话的生命周期;
8、 地址过滤以及消息头的处理;
9、 模拟(Impersonation);
绑定
• 绑定是用于指定连接到Windows Communication Foundation (WCF)
服务终结点所必需的通信详细信息的对象 WCF服务中的每个终结 服务终结点所必需的通信详细信息的对象。WCF 服务中的每个终结点都要求正确指定绑定。
• 绑定最起码必须指定要使用的传输(如HTTP 或TCP )。还可以通过绑定来设置其他特征,如安全和事务支持。
• 绑定中的信息可能非常基本也可能非常复杂 最基本的绑定仅指定 • 绑定中的信息可能非常基本,也可能非常复杂。最基本的绑定仅指定必须用于连接到终结点的传输协议 (如HTTP)。一般来说,绑定包含的有关如何连接到终结点的信息属于以下类别中的一种。– 协议
• 确定要使用的安全机制:可靠消息传递功能或事务上下文流设置。
– 编码
• 确定消息编码(例如,文本或二进制)。
– 传输
• 确定要使用的基础传输协议(例如 TCP 或HTTP) • 确定要使用的基础传输协议(例如,TCP 或HTTP)。
• 绑定中的信息可能十分复杂,而且某些设置可能与其他设置不兼容 因此WCF包含 组系统提供的绑定 这些 置不兼容。因此,WCF 包含一组系统提供的绑定。这些
绑定旨在满足大多数应用程序要求。下面的类表示系统
提供的绑定的一些示例: 提供的绑定的 些示例:
– BasicHttpBinding :一个HTTP 协议绑定,适用于连接到符合WS-I 基本配置文件规范的Web 服务(例如,基于ASP.NET Web 服务的服务)。
– WSHttpBinding :一个可互操作的绑定,适用于连接到符合WS-* 协议的终结点。 协议的终结点。
– NetNamedPipeBinding:使用.NET Framework 连接到同一计算机上的其他WCF 终结点。
使用自己的绑定
– 如果系统提供的绑定都不具有服务应用程序所需的正确功能组合,则可以创建自己的绑定。有两种方法可以实现此目的。
– 可以使用CustomBinding 对象从预先存在的绑定元素创建新的绑 可以使用CustomBinding 对象从预先存在的绑定元素创建新的绑定
– 也可以通过从Binding 绑定派生来创建完全由用户定义的绑定
• 使用绑定
– 使用绑定需要执行两个基本步骤:
选择或定义绑定 最简单的方法就是选择WCF包含的系统提供 – 选择或定义绑定。最简单的方法就是选择WCF 包含的系统提供绑定中的一个,并且通过该绑定的默认设置来使用它。
– 创建一个使用所选择或定义的绑定的终结点。
代码和配置
– 可以通过两种方式来定义绑定:
– 通过代码或通过配置。
这两种方法与您使用的是系统提供的绑定还是自定义绑定无关 – 这两种方法与您使用的是系统提供的绑定还是自定义绑定无关。通常,使用代码可以使在设计时对绑定的定义拥有完全的控制。
– 另一方面,使用配置则使系统管理员或WCF 服务或客户端的用户可以更改绑定的参数,而不必重新编译服务应用程序。由于无法预测用于部署WCF 应用程序的特定计算机要求,因而通常需要这种灵活性。通过将绑定(和寻址)信息保持在代码外部,人们可以更改这些信息,而不必重新编译或重新部署应用程序。
– 请注意,代码中定义的绑定是在配置中指定的绑定之后创建的,这使得代码定义的绑定可以覆盖配置中定义的任何绑定。
终结点
• 与Windows Communication Foundation (WCF) 服务的所有通信是通过该服务的终结点进行的 利用终结点 所有通信是通过该服务的终结点进行的。利用终结点,
客户端可访问WCF 服务提供的功能终结点的结构 • 终结点的结构
– 地址。地址唯一标识终结点并告知潜在客户服务的所在位置
– 绑定。绑定指定如何与终结点进行通信 绑定。绑定指定如何与终结点进行通信
– 服务协定。服务协定概述了终结点向客户端公开的功能
• 指定服务的终结点有两种方式
– 通过使用代码的强制方式或通过配置的声明方式。在代码中定义终结点通常并不可行因为已部署服务的绑定和地址通常不同于 终结点通常并不可行,因为已部署服务的绑定和地址通常不同于开发服务时使用的绑定和地址。一般而言,使用配置定义服务终结点比使用代码更为可行。使绑定和寻址信息保持在代码之外可以在对它们进行更改后不必重新编译和重新部署应用程序。
<?xml version="1.0" encoding="utf-8"?> fi ti <confi gurati on> <system.serviceModel> <bindings> <basicHttpBinding> basicHttpBinding <binding name="myBindingConfiguration1" closeTimeout="00:01:00" /> <binding name="myBindingConfiguration2" closeTimeout="00:02:00" /> </basicHttpBinding> </bi di > </bi ndi ngs > <services> <service name="myServiceType"> <endpoint p address="myAddress" binding="basicHttpBinding" bindingConfiguration="myBindingConfiguration1" /> </service> </ i > </ services > </system.serviceModel> </configuration>
终结点的地址由EndpointAddress 类表示,该类包含一个
表示服务地址的统 资源定位符(URI) 表示服务地址的统一资源定位符(URI) ,
• 大多数传输的地址URI 包含四个部分。例如,
“http // fabrikam com 322/mathser ice s c/sec re “http :// www.fabrikam .com :322/mathser vice .svc/secure
Endpoint”这个URI 具有以下四个部分:
– 方案:http: 方案:http:
– 计算机:www.fabrikam.com
– (可选)端口:322
– 路径:/mathservice.svc/secureEndpoint
配置文件终结点的配置
<system.serviceModel> <i> < servi ces > <service name="Microsoft.ServiceModel.S amples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8000/ ServiceModelSamples/service"/> </baseAddresses> </host> <endpoint address ="" <endpoint address binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" /> <endpoint address="/test" binding="wsHttpBinding" contract="Microsoft Ser iceModel Samples ICalc lator"/> contract = " Microsoft. ServiceModel. Samples. ICalc ulator" /> Model.Samples.ICalculator" /> <endpoint address="net.tcp://localhost:9000/servicemodelsamples/service" binding="netTcpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" /> <!-- the mex endpoint is another reltive address explosed at http://localhost:8000/ServiceModelSamples/service/mex --> <endpoint address="mex" binding="mexHttpBinding" contract ="IMetadataExchange " / > contract IMetadataExchange / </service> </services>
元数据终结点地址:
Windows Communication Foundation (WCF) 服务通过发布 个或多个元数据终结点来发布元数据 布一个或多个元数据终结点来发布元数据。
• 发布服务元数据之后,可以通过标准协议(如WS-MetadataE change (MEX) 和HTTP/GET 请求)来使用 MetadataExchange (MEX) 和HTTP/GET 请求)来使用该元数据。
• 元数据终结点类似于其他服务终结点:它们都有一个地 • 元数据终结点类似于其他服务终结点:它们都有 个地址、一个绑定和一个协定,并且它们都可通过配置或使用代码添加到服务主机。 代码添加到服务 机
• 若要启用发布元数据终结点,必须将ServiceMetadataBehavior 服务行为添加到该服务。默认情况下,WCF 服务不发布元数据终结点,所以必须将它们显式添加到服务才能为服务启用元数据发布。
<configuration> <system.serviceModel> <services> i <serv i ce name="Metadata.Samples.SimpleService" behaviorConfiguration="SimpleServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8001/MetadataSample"/> </baseAddresses> </host> <endpoint address="" binding=" wsHttpBinding" mexHttpBinding(对于HTTP 发布)。 mexHttpsBinding(对于HTTPS 发布)。 mexNamedPipeBindin g(对于命名管道发布)。 binding= wsHttpBinding contract="Metadata.Sam ples.ISimpleService" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </ i > pg对于命名管道发布 mexTcpBinding(对于TCP 发布)。 </ servi ce> </services> <behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" /> <serviceDebug includeExceptionDetailInFaults="False" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>