如何配置和承载服务
配置绑定
配置服务:任务
为什么要配置服务:在设计和实现服务协定后,即可配置服务。 在其中可以定义和自定义如何向客户端公开服务指定可以找到服务的地址、服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型
两种配置方式:
在配置文件中配置
在代码中配置
配置服务:通过配置文件
WCF术语介绍
服务协定:服务协定将多个相关的操作联系在一起,组成单个功能单元。 协定可以定义服务级设置,如服务的命名空间、对应的回调协定以及其他此类设置。 在大多数情况下,协定是通过用您所选的编程语言创建一个接口并将 ServiceContractAttribute 属性应用于该接口来定义的。 通过实现该接口,可生成实际的服务代码。
操作协定:操作协定定义参数并返回操作的类型。 在创建定义服务协定的接口时,可以通过将 OperationContractAttribute 属性应用于协定中包含的每个方法定义来表示一个操作协定。 可以将操作建模为采用单个消息作为参数并返回单个消息,或者建模为采用一组类型作为参数并返回一个类型。 在后一种情况下,系统将确定需要为该操作交换的消息的格式。
宿主:服务必须承载于某个进程中。 “宿主”是控制服务的生存期的应用程序。 服务可以是自承载的,也可以由现有的宿主进程进行管理。
Service元素
Service元素:在<services>配置节中可以定义多个服务,每一个服务都被放到<service>配置节中,WCF的宿主程序可以通过配置文件找到这些定义的服务并发布这些服务。
每个服务都具有以下属性:
name:指定提供服务协定的实现的类型。 这是完全限定名称(命名空间和类型名称)
behaviorConfiguration:指定一个在behaviors 元素中找到的behavior 元素的名称。 指定的行为控制操作,例如服务是否允许模拟。
<service>配置节包含name和behaviorConfiguration属性。其中,name配置了实现Service Contract的类型名。类型名必须是完整地包含了命名空间和类型名。而behaviorConfiguration的配置值则与其后的<behaviors>配置节的内容有关。<endpoint>是<service>配置节的主体,其中,<endpoint>配置节包含了endpoint的三个组成部分:Address、Binding和Contract。由于具体的binding配置是在<bindings>配置节中完成,因而,在<endpoint>中配置了bindingConfiguration属性,指向具体的binding配置。
<services> <service name="BruceZhang.MyService" behaviorConfiguration="MyBehavior"> <endpoint address="" binding="netTcpBinding" bindingConfiguration="DuplexBinding" contract="BruceZhang.IHello" /> </service> </services>
<behaviors>配置节
当我们在定义一个实现了Service Contract的类时, binding和address信息是客户端必须知道的,否则无法调用该服务。然而,如果需要指定服务在执行方面的相关特性时,就必须定义服务的behavior。
Endpoint元素
每个终结点都需要以下属性表示的地址、绑定和协定:
address:指定服务的统一资源标识符(URI),它可以是一个绝对地址或是一个相对于服务基址给定的地址,如果设置为空字符串,则指示在创建服务的ServiceHost时,终结点在指定的基址上可用。
Binding:通常,指定一个类似WsHttpBinding的系统提供的绑定,但也可以指定一个用户定义的绑定。 指定的绑定确定传输协议类型、安全和使用的编码,以及是否支持或启用可靠会话、事务或流。
bindingConfiguration:如果必须修改绑定的默认值,则可通过在bindings元素中配置相应的binding元素来执行此操作 此属性应赋予与用于更改默认值的binding 元素的name 属性相同的值。
contract:指定定义协定的接口。 这是在由service 元素的name 属性指定的公共语言运行库(CLR) 类型中实现的接口。
<services> <service name="WcfServiceThree.Service1" behaviorConfiguration="serviceDemo"> <host> <baseAddresses> <add baseAddress="http://localhost:1123/Service1.svc/Service1"/> </baseAddresses> </host> <endpoint address="" binding="wsDualHttpBinding" contract="WcfServiceThree.IService1"> <identity> <dns value="localhost"/> </identity> </endpoint> </service> </services> <behaviors> <serviceBehaviors> <behavior name="serviceDemo"> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors>
绑定是用于指定连接到WCF服务终结点所必需的通信详细信息的对象,WCF服务中的每个终结都要求正确指定绑定
绑定最起码必须指定要使用的传输(如HTTP 或TCP
绑定包含的有关如何连接到终结点的信息属于以下类别中的一种。
– 协议: 确定要使用的安全机制:可靠消息传递功能或事务上下文流设置。
– 编码: 确定消息编码(例如,文本或二进制)。
– 传输:确定要使用的基础传输协议(例如 TCP或HTTP)
WCF 包含一组系统提供的绑定。这些绑定旨在满足大多数应用程序要求。 下面的类表示系统提供的绑定的一些示例:
– BasicHttpBinding:一个HTTP 协议绑定,适用于连接到符合WS-I 基本配置文件规范的Web 服务(例如,基于ASP.NET Web 服务的服务)。
– WSHttpBinding:一个可互操作的绑定,适用于连接到符合WS-* 协议的终结点。 协议的终结点。
– NetNamedPipeBinding:使用.NET Framework 连接到同一计算机上的其他WCF 终结点。
– NetMsmqBinding:使用.NET Framework 创建与其他WCF 终结点的排队消息连接。.
配置服务:使用代码实现
Uri baseAddress = new Uri("http://localhost:8000/HelloService"); string address = "http://localhost:8000/HelloService/MyService"; using (ServiceHost serviceHost = new ServiceHost(typeof(HelloService), baseAddress)) { serviceHost.AddServiceEndpoint(typeof(IHello), new BasicHttpBinding(), address); serviceHost Open(); Console.WriteLine("Press <enter> to terminate service"); Console.ReadLine(); serviceHost.Close(); serviceHost.Close(); }