WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?2012-11-11 博客园 Artech任何一个程序都需要运行于一个确定的进程中,进程是一个容器,其中包含程序实例运行所需的资源。同理,一个WCF服务的监听与执行同样需要通过一个进程来承载。我们将为WCF服务创建或指定一个进程的方式称为服务寄宿(Service Hosting)。服务寄宿的本质通过某种方式,创建或者指定一个进程用以监听服务的请求和执行服务操作,为服务提供一个运行环境。服务寄宿的方式大体分两种:一种是为一组WCF服务创建一个托管的应用程序,通过手工启动程序的方式对服务进行寄宿,所有的托管的应用程序均可作为WCF服务的宿主,比如Console应用、Windows Forms应用和ASP.NET应用等,我们把这种方式的服务寄宿方式称为自我寄宿(Self Hosting)。另一种则是通过操作系统现有的进程激活方式为WCF服务提过宿主,Windows下的进程激活手段包括IIS、Windows Service或者WAS(Windows Process Activation Service)等。服务寄宿的手段是为一个WCF服务类型创建一个ServiceHost对象(或者任何继承于ServiceHostBase的对象)。无论采用哪种寄宿方式,在为某个服务创建ServiceHost的过程中,WCF框架内部会执行一系列的操作,其中最重要的步骤就是为服务创建
服务描述(Service Description)。在本篇文章中,我们将对服务描述进行全面的介绍。WCF服务描述通过类型System.ServiceModel.Description.ServiceDescription表示,ServiceDescription对象是WCF服务运行时的描述。除了包含WCF服务的一些基本信息,比如服务的名称、命名空间和CLR类型等,ServiceDescription还包含服务所有终结点和服务行为的描述。
一、 ServiceDescription与ServiceBehavior从下面ServiceDescription的定义可以看出,ServiceDescription中定义了一系列属性,它们的含义如下:
Behaviors:服务行为(Service Behavior)的集合
ConfigurationName:服务的在配置文件中的名称,默认为服务类型的全名(命名空间+类型名称)
Name:服务的名称,默认为服务类型名称(不包含命名空间)
Namespace:服务的命名空间,默认为“http://tempuri.org/”
ServiceType:服务的CLR类型
1: public class ServiceDescription
2: {
3: //其他成员
4: public KeyedByTypeCollection<IServiceBehavior> Behaviors { get; }
5: public string ConfigurationName { get; set; }
6: public ServiceEndpointCollection Endpoints { get; }
7: public string Name { get; set; }
8: public string Namespace { get; set; }
9: public Type ServiceType { get; set; }
10: }
1、Name与NamespaceServiceDescription的
Name和
Namespace分别表示服务的名称和命名空间,这两个属性同样体现在服务发布的WSDL中。可以通过System.ServiceModel.ServiceBehaviorAttribute的
Name和
Namespace属性进行设定。ServiceDescription的Name和Namespace的默认值分别为服务类型名称和http://tempuri.org/,所以下面两种定义是等效的。
1: [ServiceBehavior]
2: public class CalculatorService : ICalculator
3: {
4: //省略成员
5: }
1: [ServiceBehavior(Name = "CalculatorService", Namespace = "http://tempuri.org/")]
2: public class CalculatorService : ICalculator
3: {
4: //省略成员
5: }
而ServiceDescription的Namespace映射WSDL的目标命名空间(targetNamespace),Name则直接对应<wsdl:service>节点的Name属性。在下面的服务定义中,通过ServiceBehaviorAttribute将Name和Namespace设置为“CalcService”和“http://www.artech.com/”,后面的XML体现了服务在WSDL表示。
1: [ServiceBehavior(Name = "CalcService", Namespace = "http://www.artech.com/")]
2: public class CalculatorService : ICalculator
3: {
4: //省略成员
5: }
1: <?xml version="1.0" encoding="utf-8"?>
2: <wsdl:definitions name="CalcService" targetNamespace= http://www.artech.com/
3: ...>
4: ......
5: <wsdl:service name="CalcService">
6: ......
7: </wsdl:service>
8: </wsdl:definitions>