WinVista新技术 WCF开发指南之构建服务( 三 )



六. IIS宿主

在IIS中宿主一个服务的主要优点是,在发生客户端请求时宿主进程会被自动启动,并且你可以依靠IIS来管理宿主进程的生命周期 。IIS宿主的主要不利在于,你仅仅可以在IIS5和IIS6上使用HTTP传输数据;而且当使用IIS5时,你仅可以使用80端口 。在IIS上宿主非常类似于宿主一个典型的ASMX Web服务 。你需要在IIS下创建一个虚拟的目录并且提供一个.svc文件 。这个.svc文件的功能就象一个被用来标识服务的code-behind文件和类的.asmx文件一样 。

<%@ ServiceHost
Language = "C#"
Debug = "true"
CodeBehind = "~/App_Code/MyService.cs"
Service = "MyService"
%>
你甚至可以把服务代码以内联方式注入到.svc文件中,但是不建议这样用(就象对于ASMX的情形一样) 。一旦你准备好了.svc文件,你就可以使用一个浏览器来观看它 。如果一切顺利,那么你将得到一个确认页面 。

Visual Studio 2005能够为你生成一个新的IIS宿主的服务 。这只要从File菜单下选择"New Website",然后从"New Web Site"对话框中选择WinFX服务 。这使得Visual Studio 2005创建一个新的Web站点,服务代码和匹配的.svc文件 。另外,Web站点配置文件必须列举出你想要暴露的服务类型 。你需要使用完全限定类型名(包括程序集名),如果类型来自于一个未引用的程序集的话 。

<system.serviceModel>
<services>
<service name="MyNamespace.MyService">
...
</service>
</services>
</system.serviceModel>
七. 自宿主

自宿主是当开发者负责提供和管理宿主进程的生命周期时使用的技术名词 。自宿主被应用在位于客户端和服务之间的一个进程(或计算机)边界环境中,以及当使用进程中服务的情况下(也就是说,与客户端处于相同的进程中) 。你需要提供的进程可能是任何Windows进程,例如,一个Windows表单应用程序,一个控制台应用程序或一个Windows NT服务 。注意,该进程必须在客户端调用服务之前先运行起来;典型情况下,这意味着,你必须预先启动它 。对于NT进程中服务来说这并不是一个问题 。

类似于IIS宿主,宿主应用程序配置文件必须列出你想宿主的服务的类型并且暴露给外界 。而且,该宿主进程必须在运行时刻显式地注册服务类型并且打开该宿主以便于客户端调用 。典型地,这是在Main()方法中使用如下定义的助理类ServiceHost实现的:

public interface ICommunicationObject : IDisposable
{
void Open();
void Close();
//更多成员
}
public abstract class CommunicationObject :
ICommunicationObject
{...}
public class ServiceHostBase : CommunicationObject,...
{...}
public class ServiceHost : ServiceHostBase,...
{
public ServiceHost(Type serviceType,
params Uri[]baseAddresses);
//更多成员
}
提供给ServiceHost的构造函数的信息有:服务类型和(可选)默认的基地址 。该基地址集可以是一个空集(以后,你可以配置不同的基地址) 。拥有一组基地址能够使服务接受在多个地址和协议上的调用 。注意,每个ServiceHost实例都关联与一个特定的服务类型,并且如果宿主进程需要宿主多个类型的服务的话,你需要一些匹配的ServiceHost实例 。通过调用宿主中的ServiceHost.Open()方法,你允许调入(call-in);并且通过调用ServiceHost.Close()方法,你可以体面地退出宿主实例并完成到当前客户端的数据发送,并且还要拒绝未来的客户端调用-即使宿主进程仍在运行中 。典型地,关闭操作是在宿主进程关闭时实现的 。例如,为了把这个服务宿主在一个Windows表单应用程序中:

[ServiceContract]
interface IMyContract
{...}
class MyService : IMyContract
{...}
你可以编写:

推荐阅读