第三节 配置服务
这一节会了解到以下内容:
• 配置服务概述
• 配置绑定
• 配置终结点
一、什么是配置服务
1.1 概述
•在设计和实现服务协定后,即可配置服务。在其中可以定义和自定义如何向客户端公开服务,包括指定可以找到服务的地址、服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型。
地址:客户端能找到服务的位置
传输:用HTTP还是TCP等协议
消息编码:文本格式呢还是其他
安全类型:服务要不要安全控制,什么样的安全控制
•两种方式可以进行配置
– 使用配置文件配置
– 在代码中强制配置(在代码中写,没有办法在后期部署的时候进行修改)
•实际上,编写配置是WCF应用程序编程的主要部分。
1.2 使用配置文件配置WCF服务
– 通过使用配置文件配置WCF服务,可提供在部署时而非设计时提供终结点和服务行为数据的灵活性
– 可使用.NET Framework 配置技术对WCF 服务进行配置。通常情况下,向承载WCF 服务的Internet 信息服务(IIS) 网站的Web.config 文件添加XML 元素。通过这些元素,可以逐台计算机更改详细信息,例如终结点地址(用于与服务进行通信的实际地址)。此外,WCF 包括几个系统提供的元素,可用于快速选择服务的最基本的功能
– WCF 使用.NET Framework 的System.Configuration 配置系统
• 使用IIS来承载服务--使用Web.config文件
• 使用任何其他宿主环境—使用或App.config 文件指定设置。
下面是一个典型的配置信息。
I.在Services节点下面有如下几个元素
①Service元素
每个服务都具有以下属性:
– name。指定提供服务协定的实现的类型。这是完全限定名称(命名空间和类型名称)。
– behaviorConfiguration。指定一个在behaviors元素中找到的behavior元素的名称。指定的行为控制操作,例如服务是否允许
模拟。
②endpoint元素
每个终结点都需要以下属性表示的地址、绑定和协定:
– address。指定服务的统一资源标识符(URI),它可以是一个绝对地址,或是一个相对于服务基址给定的地址。如果设置为空字符串,则指示在创建服务的ServiceHost时,终结点在指定的基址上可用。
– binding。通常,指定一个类似WsHttpBinding的系统提供的绑定,但也可以指定一个用户定义的绑定。指定的绑定确定传输协议类型、安全和使用的编码,以及是否支持或启用可靠会话、事务或流。
– bindingConfiguration。如果必须修改绑定的默认值,则可通过在bindings 元素中配置相应的binding元素来执行此操作。此属性应赋予与用于更改默认值的binding元素的name属性相同的值。
– contract。指定定义协定的接口。这是在由service 元素的name属性指定的公共语言运行库(CLR)类型中实现的接口。
举例:
1 <services> 2 <service name="WcfServiceLibrary1.Service1"> 3 <host> 4 <baseAddresses> 5 <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" /> 6 </baseAddresses> 7 </host> 8 <!-- Service Endpoints --> 9 <!-- Unless fully qualified, address is relative to base address supplied above --> 10 <endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1"> 16 <identity> 17 <dns value="localhost"/> 18 </identity> 19 </endpoint> 23 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 24 </service> 25 </services>
<endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1">这里address为空,那么就默认使用baseAddress的地址,这里endpoint也没有使用bindingConfiguration,而是使用了系统默认的binding。
II.在bindings节点下面有如下几个元素
上部分是bindings节点,下部分是services节点,两者是同级别的。上面说过,endpoint节点有一个bindingConfiguration属性,这个属性就是配合着bindings节点来使用的。
首先,在services节点的endpoint中指定了bindingConfiguration属性,说明这是一个自定义的绑定方式,使用了myBindingConfiguration1这个配置,但是这个配置属于谁呢?
然后,去找binding="basicHttpBinding"的节点,上面那个myBindingConfiguration1配置应该是属于basicHttpBinding的,basicHttpBinding又是在哪里进行定义的呢,就要去看bindings节点下是不是有这个basicHttpBinding。
最后在bindings节点下找到了basicHttpBinding,进而找到了myBindingConfiguration1的配置内容。
III.behaviors元素
解释:endpoint节点定义了行为配置信息,然后就去找这个行为对应的信息,就像上图所示,behaviors节点和services节点也在同一级。
1.3绑定
• 绑定是用于指定连接到Windows Communication Foundation (WCF)服务终结点所必需的通信详细信息的对象。WCF服务中的每个终结
点都要求正确指定绑定。
• 绑定最起码必须指定要使用的传输(如HTTP 或TCP)。还可以通过绑定来设置其他特征,如安全和事务支持。
• 绑定中的信息可能非常基本,也可能非常复杂。最基本的绑定仅指定必须用于连接到终结点的传输协议(如HTTP)。一般来说,绑定包含有关如何连接到终结点的信息属于以下类别中的一种。
– 协议
• 确定要使用的安全机制:可靠消息传递功能(加密)或事务上下文流设置。
– 编码
• 确定消息编码(例如,文本或二进制)。
– 传输
• 确定要使用的基础传输协议(例如,TCP 或 HTTP)。绑定中的信息可能十分复杂,而且某些设置可能与其他设置不兼容。因此,WCF包含一组系统提供的绑定。这些绑定旨在满足大多数应用程序要求。下面的类表示系统提供的绑定的一些示例:
BasicHttpBinding:一个HTTP 协议绑定,适用于连接到符合WS-I基本配置文件规范的Web 服务(例如,基于ASP.NET Web 服务的务)。
WSHttpBinding:一个可互操作的绑定,适用于连接到符合WS-*协议的终结点。
NetNamedPipeBinding:使用.NET Framework连接到同一计算机上的其他WCF终结点。
NetMsmqBinding:使用.NET Framework创建与其他WCF终结点的排队消息连接(非实时的时候)。
• 使用自己的绑定
– 如果系统提供的绑定都不具有服务应用程序所需的正确功能组合,则可以创建自己的绑定。有两种方法可以实现此目的。
可以使用CustomBinding对象从预先存在的绑定元素创建新的绑定
也可以通过从Binding绑定派生来创建完全由用户定义的绑定
• 使用绑定需要执行两个基本步骤:
选择或定义绑定。最简单的方法就是选择WCF 包含的系统提供绑定中的一个,并且通过该绑定的默认设置来使用它。
创建一个使用所选择或定义的绑定的终结点。
• 代码和配置
– 可以通过两种方式来定义绑定:
– 通过代码或通过配置。
– 这两种方法与您使用的是系统提供的绑定还是自定义绑定无关。通常,使用代码可以使在设计时对绑定的定义拥有完全的控制。
– 另一方面,使用配置则使系统管理员或WCF 服务或客户端的用户可以更改绑定的参数,而不必重新编译服务应用程序。由于无法预测用于部署WCF 应用程序的特定计算机要求,因而通常需要这种灵活性。通过将绑定(和寻址)信息保持在代码外部,人们可以更改这些信息,而不必重新编译或重新部署应用程序。
– 请注意,代码中定义的绑定是在配置中指定的绑定之后创建的,这使得代码定义的绑定可以覆盖配置中定义的任何绑定。
1.4实例
I.使用配置文件配置服务
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 4 <appSettings> 5 <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 6 </appSettings> 7 <system.web> 8 <compilation debug="true" /> 9 </system.web> 10 <!-- When deploying the service library project, the content of the config file must be added to the host's 11 app.config file. System.Configuration does not support config files for libraries. --> 12 <system.serviceModel> 13 <services> 14 <service name="WcfServiceLibrary1.Service1"> 15 <host> 16 <baseAddresses> 17 <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" /> 18 </baseAddresses> 19 </host> 20 <!-- Service Endpoints --> 21 <!-- Unless fully qualified, address is relative to base address supplied above --> 22 <endpoint address="" binding="basicHttpBinding" bindingConfiguration="bandingTest" contract="WcfServiceLibrary1.IService1" behaviorConfiguration="behaviorTest"> 23 <!-- 24 Upon deployment, the following identity element should be removed or replaced to reflect the 25 identity under which the deployed service runs. If removed, WCF will infer an appropriate identity 26 automatically. 27 --> 28 <identity> 29 <dns value="localhost"/> 30 </identity> 31 </endpoint> 32 <!-- Metadata Endpoints --> 33 <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 34 <!-- This endpoint does not use a secure binding and should be secured or removed before deployment --> 35 <!-- 公布元数据有关的终结点 --> 36 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 37 </service> 38 </services> 39 40 <behaviors> 41 <serviceBehaviors> 42 <behavior> 43 <!-- To avoid disclosing metadata information, 44 set the values below to false before deployment --> 45 <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> 46 <!-- To receive exception details in faults for debugging purposes, 47 set the value below to true. Set to false before deployment 48 to avoid disclosing exception information --> 49 <serviceDebug includeExceptionDetailInFaults="False" /> 50 </behavior> 51 </serviceBehaviors> 52 <endpointBehaviors> 53 <behavior name="behaviorTest"> 54 <callbackDebug includeExceptionDetailInFaults="true"/> 55 </behavior> 56 </endpointBehaviors> 57 </behaviors> 58 59 <bindings> 60 <basicHttpBinding> 61 <binding name ="bandingTest" transferMode="Buffered"></binding> 62 </basicHttpBinding> 63 </bindings> 64 </system.serviceModel> 65 66 </configuration>
这里查看一下这个配置信息,可以看到<system.serviceModel>,这个就是一个服务的配置节点,可以看到有三块
<servcies><behaviors><bindings>,也就是上文中提到的,三个节点。
<servcies>内部:<host>节点主要用于配置基本的地址信息
<endpoint>这里可以看到配置了bindingConfiguration和behaviorConfiguration,对应的就在<behaviors>节点内部name="behaviorTest"的endpointBehaviors(节点行为,可以看到还有一个serviceBehaviors(服务行为)),以及<bindings>节点内的name ="bandingTest" 的binding
二、配置终结点
2.1终结点
• 与Windows Communication Foundation (WCF) 服务的所有通信是通过该服务的终结点进行的。利用终结点,客户端可访问WCF服务提供的功能。
• 终结点的结构
– 地址。地址唯一标识终结点并告知潜在客户服务的所在位置
– 绑定。绑定指定如何与终结点进行通信
– 服务协定。服务协定概述了终结点向客户端公开的功能
• 指定服务的终结点有两种方式
– 通过使用代码的强制方式或通过配置的声明方式。在代码中定义终结点通常并不可行,因为已部署服务的绑定和地址通常不同于开发服务时使用的绑定和地址。一般而言,使用配置定义服务终结点比使用代码更为可行。使绑定和寻址信息保持在代码之外可以在对它们进行更改后不必重新编译和重新部署应用程序。
终结点地址的定义
• 终结点的地址由EndpointAddress类表示,该类包含一个表示服务地址的统一资源定位符(URI),
• 大多数传输的地址URI 包含四个部分。例如,“http://www.fabrikam.com:322/mathservice.svc/secure
Endpoint”这个URI 具有以下四个部分:
– 方案:http:
– 计算机:www.fabrikam.com
– (可选)端口:322
– 路径:/mathservice.svc/secureEndpoint
• 在配置文件中定义终结点地址,下面都是 1 <endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" /> 2 <endpoint address="/test" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" /> 3 <endpoint address="net.tcp://localhost:9000/servicemodelsamples/service" binding="netTcpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" /> 4 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
2.2元数据终结点地址
上文中<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />涉及到了元数据的问题,那什么是元数据呢?
就是服务的说明文件,各个接口啊、方法啊……
元数据终结点地址
• Windows Communication Foundation (WCF) 服务通过发布一个或多个元数据终结点来发布元数据。
• 发布服务元数据之后,可以通过标准协议(如WSMetadataExchange(MEX) 和 HTTP/GET 请求)来使用该元数据。
• 元数据终结点类似于其他服务终结点:它们都有一个地址、一个绑定和一个协定,并且它们都可通过配置或使用代码添加到服务主机。
• 若要启用发布元数据终结点,必须将ServiceMetadataBehavior 服务行为添加到该服务。默认情况下,WCF服务不发布元数据终结点,所以必须将它们显式添加到服务才能为服务启用元数据发布。
mexHttpBinding(对于HTTP 发布)。
mexHttpsBinding(对于HTTPS 发布)。
mexNamedPipeBinding(对于命名管道发布)。
mexTcpBinding(对于TCP 发布)。
<behaviors> <serviceBehaviors> <behavior name="SimpleServiceBehavior"> <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" /> <serviceDebug includeExceptionDetailInFaults="False" /> </behavior> </serviceBehaviors> </behaviors>
注意:不公布元数据的终结点是没办法在服务引用的时候找到服务的。
举例:
在服务的配置文件中有下面这句话的时候
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
在客户端打开add service Reference,可以看到公布的服务,注意那个地址,"xxxx/service1/mex"