WCF Essentials (4)

本文介绍了WCF服务的三种宿主方式:IIS Hosting、Self-Hosting 和 WAS Hosting。IIS Hosting便于管理和配置,但仅限HTTP传输;Self-Hosting提供最大灵活性,需手动管理生命周期;WAS Hosting结合两者优点,支持多种传输方式并具备高级管理功能。

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 示例

<%@ ServiceHost
  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;
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

<%@ ServiceHost Language="C#" Debug="true" Service="WCFService1.Service1" CodeBehind="Service1.svc.cs" %>


Service1.svc.cs

using System;
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

<?xml version="1.0"?>

...

<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" 这样的地址来添加服务引用,进而自动生成代理文件。

using (var proxy = new ServiceReference.Service1Client())
{
  proxy.DoWork();
}


(在实际开发中,我们通常会将服务和契约封装到一个类库之中。此时使用 IIS hosting 的方式会有些变化,详细步骤可以参考《[WCF 学习笔记] 12. 宿主环境》)

(2) Self-Hosting

采 用 Self-hosting,开发人员必须自己来管理宿主进程的生命周期。这种宿主通常是 Windows Forms Application、Console Application 、Windows NT Service 。我们必须显式使用 ServiceHost 实例来注册服务,并在客户端调用前调用 Open() 方法启动这些宿主。

public interface ICommunicationObject
{
  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() 方法时,宿主实例并不会立即结束,它会等待相关调用完成。与此同时,它拒绝任何新的调用接入。

[ServiceContract]
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))

<system.serviceModel>
  <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 是最佳的选择。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值