WCF服务不能凭空存在,每个WCF服务都必须托管(Hosting)在Windows进程中,该进程被称为宿主进程(Hosting Process)。单个宿主进程可以托管多个服务,而相同的服务类型也能够托管在多个宿主进程中。宿主可以由IIS提供,也可以由Windows Vista的Windows激活服务(Windows Activation Service,WAS),或者开发者直接将它作为应用程序的一部分。

注意:一种特殊的托管方式称为进程内托管(In-Process Hosting),简称in-proc。服务与客户端驻留在相同的进程中。通过定义,开发者能够提供进程内托管。

IIS托管

IIS托管的优势是宿主进程可以在客户端提交第一次请求的时候自动启动,还可以借助IIS管理宿主进程的生命周期。IIS托管的主要缺点在于只能使用HTTP协议。如果是IIS5,还要受端口限制,要求所有服务必须使用相同的端口号。

在IIS中托管服务与经典的ASMX Web服务托管类似,需要在IIS下创建虚拟目录,并提供一个.svc文件。.svc文件的功能与.asmx文件相似,主要用于识别隐藏在文件和类后面的服务代码。.svc文件的语法结构如下:

  1. <% ServiceHost  
  2.     Language = "C#" 
  3.     Debug = "true" 
  4.     CodeBehind = "~/App_Code/MyService.cs" 
  5.     Service = "MyService" 
  6. %> 

使用IIS托管,服务的基地址必须与.svc文件的地址保持一致。

自托管

所谓自托管(Self-Hosting),就是由开发者提供和管理宿主进程的生命周期。自托管适用于如下场景:需要确定客户端与服务之间的进程(或机器)边界时;使用进程内托管,即服务与客户端处于相同的进程中时。进程可以使任意的Windows进程,如Windows窗体应用程序,控制台应用程序或Windows NT服务。注意:进程必须在客户端调用服务之前运行,这意味着通常必须先启动进程。

宿主进程必须在运行时显式地注册服务类型,同时为客户端的调用打开宿主,因此,我们才要求进程必须在客户端调用到达之前运行。创建宿主的方法通常是在Main()方法中调用ServiceHost类。

注意:每个ServiceHost实例都与特定的服务类型相关,如果宿主进程需要运行多个服务类型,则必须创建与之匹配的多个ServiceHost实例。