7. 宿主 (Hosting)
WCF 服务不能生存于虚空之中,它必须寄宿在一个被称之为 "宿主进程(host process)" 的 Windows 进程里。每个宿主进程可以寄宿多个服务,每种服务也可以在宿主进程中寄宿多次(地址不能相同)。WCF 并没有明确规定宿主进程不能是客户端进程,但基于错误和安全隔离等原因,我们更提倡将其和客户端相分离。另外对于宿主进程的类型也没有过多的限制,它可以 是 IIS、WAS(Widows Activation Service),或者是某个桌面程序。
(将服务放到客户端程序里,这种宿主方式有个专门的称呼 —— in-process hosting,或者简称为 in-proc)
(1) IIS Hosting
使 用 IIS (Microsoft Internet Information Server) 作为服务宿主最主要的优势是:宿主进程会在客户端第一次发出请求时自动启用,还可以直接使用 IIS 的生命周期管理策略。而最主要的劣势则是:我们无法使用 HTTP 以外的传输模式。在 IIS5 环境下,让所有服务使用相同的端口号也会非常麻烦。
使 用 IIS 作宿主非常像 ASMX web service,你必须创建一个虚拟目录(virtual directory),并且还要进行一些必要的配置使其支持 .svc 文件。.svc 文件如同 .asmx,用于识别服务代码文件和类型。(需要配置码?我安装 .NET FX 3.x 后就已经配置好了啊)
.svc 示例
Language = "C#"
Debug = "true"
CodeBehind = "~/App_Code/MyService.cs"
Service = "MyService"
%>
使用 IIS 宿主时,服务端点的基本地址(Endpoint base address)总是使用 .svc 所在虚拟路径地址。
(原文作者所使用的开发环境较早,现在使用 VS2008 Beta 创建 WCF Service Application 已经很简单了,创建项目后,相关设置都已经自动完成。)
以下是使用 VS2008 Beta2 模版自动生成的一个 WCF 项目的演示代码。
IService1.cs
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace WCFService1
{
[ServiceContract]
public interface IService1
{
[OperationContract]
void DoWork();
}
}
Service1.svc
Service1.svc.cs
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace WCFService1
{
public class Service1 : IService1
{
public void DoWork()
{
}
}
}
web.config
...
<configuration>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false"/>
<services>
<service behaviorConfiguration="WCFService1.Service1Behavior"
name="WCFService1.Service1">
<endpoint address="" binding="wsHttpBinding" contract="WCFService1.IService1" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFService1.Service1Behavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
然后我们就可以在客户端通过 "http://localhost:3674/Service1.svc" 这样的地址来添加服务引用,进而自动生成代理文件。
{
proxy.DoWork();
}
(在实际开发中,我们通常会将服务和契约封装到一个类库之中。此时使用 IIS hosting 的方式会有些变化,详细步骤可以参考《[WCF 学习笔记] 12. 宿主环境》)
(2) Self-Hosting
采 用 Self-hosting,开发人员必须自己来管理宿主进程的生命周期。这种宿主通常是 Windows Forms Application、Console Application 、Windows NT Service 。我们必须显式使用 ServiceHost 实例来注册服务,并在客户端调用前调用 Open() 方法启动这些宿主。
{
void Open( );
void Close( );
//More members
}
public abstract class CommunicationObject : ICommunicationObject
{...}
public abstract class ServiceHostBase : CommunicationObject, IDisposable,...
{...}
public class ServiceHost : ServiceHostBase,...
{
public ServiceHost(Type serviceType,params Uri[] baseAddresses);
//More members
}
我 们为 ServiceHost 构造方法提供服务类型(实现服务契约的类型),以及多个可选的基本地址(base addresses)。每个 ServiceHost 实例只能承载一个服务类型(每个服务类型可能实现多个服务契约)。如果宿主进程必须寄宿多个服务类型,那么意味着你必须创建多个 ServiceHost 实例。 Open() 方法用于启动宿主,然后客户端才能接入并发起调用。当我们调用 Close() 方法时,宿主实例并不会立即结束,它会等待相关调用完成。与此同时,它拒绝任何新的调用接入。
interface IMyContract
{...}
class MyService : IMyContract
{...}
public static void Main( )
{
Uri baseAddress = new Uri("http://localhost:8000/");
ServiceHost host = new ServiceHost(typeof(MyService), baseAddress);
host.Open( );
//Can do blocking calls
host.Close( );
}
我们可以像 IIS hosting 那样在配置文件(app.config)中对服务进行设置,也可以直接通过代码来完成。(相关细节可参考WCF Essentials (3) - 6. 端点(Endpoints))
<services>
<service name = "MyNamespace.MyService">
...
</service>
</services>
</system.serviceModel>
(3) WAS Hosting
Windows Activation Service (WAS) 作为 IIS7 的一部分,只有 Windows Vista 和 Windows Server 2008 默认提供支持。当然,我们也可以下载独立的安装包在现有操作系统上运行。要在 WAS 上宿主 WCF 服务,我们必须像 IIS 那样让其支持 .svc 文件。WAS 和 IIS 最大的不同之处在于:WAS 不限制 WCF 的传输方式,除了 HTTP,我们还是使用 TCP、P2P、MSMQ 等。
WAS 比 self-hosting 拥有更多的优势,包括应用程序池(application pooling)、循环回收(recycling)、空闲管理(idle time management)、身份管理(identity management)、隔离(isolation) 等等。当我们在 Vista Server 或者 Windows Server 2008 上运行 WCF 服务时,WAS 是最佳的选择。
本文介绍了WCF服务的三种宿主方式:IIS Hosting、Self-Hosting 和 WAS Hosting。IIS Hosting便于管理和配置,但仅限HTTP传输;Self-Hosting提供最大灵活性,需手动管理生命周期;WAS Hosting结合两者优点,支持多种传输方式并具备高级管理功能。
712

被折叠的 条评论
为什么被折叠?



