任何一个程序都需要运行于一个确定的进程中,进程是一个容器,其中包含程序实例运行所需的资源。同理,一个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类型
class ServiceDescription
2: {
//其他成员
public KeyedByTypeCollection<IServiceBehavior> Behaviors { get; }
string ConfigurationName { get; set; }
public ServiceEndpointCollection Endpoints { get; }
string Name { get; set; }
string Namespace { get; set; }
public Type ServiceType { get; set; }
10: }