如何在没有iis的情况下自我托管wcf

时间:2010-03-26 17:12:51

标签: wcf

阅读WCF我们有自己的托管选项,这里的一个限制是我们必须自己管理主机进程生命周期。我在这里探索的是在没有IIS的情况下运行服务并进行自托管。

很少有事情可以想到 - 请求管理如何在这里工作。在IIS的情况下,它管理请求并控制特定线程上的dotnet。如果没有IIS,我们需要自己编写代码来管理传入的请求(例如在tcp端口上),或者WCF提供了一些类来管理请求并产生线程来处理每个线程。

  • 我知道在自托管的情况下,这需要是一个Windows服务。在自托管的情况下,我如何利用服务器上的同时请求数量,可以通过限制线程池来管理它?或者我们可以通过wcf配置它?

由于 直流

2 个答案:

答案 0 :(得分:6)

自托管不需要 Windows服务。如果您愿意,可以在控制台应用程序内自托管。如果您需要全天候访问但不想出于任何原因使用IIS,那么Windows服务就是自助托管的理想解决方案。

管理主机进程的生命周期并不是什么大问题。我使用Windows服务来托管WCF服务。我只是在我的Windows服务的OnStart()回调中启动我的WCF服务,如下所示:

private ServiceHost _host;
protected override void OnStart(string[] args)
{
    _host = new ServiceHost(typeof(CalculatorService));
    _host.Open();
}

同样,我在Windows服务的OnStop()回调中关闭了WCF服务:

protected override void OnStop()
{
    if (_host != null) _host.Close();
}

这有效地将WCF服务的生命周期与Windows服务的生命周期联系起来。您可以在任何类型的应用程序中执行类似操作 - 控制台,Windows窗体应用程序等。例如,在Windows窗体应用程序的OnLoad()回调中,启动WCF服务的ServiceHost并关闭它退出应用程序时。很简单。

WCF为您提供了处理传入请求的灵活性。例如,您可以使您的WCF服务成为单例,这意味着您将只有一个WCF服务实例。在这种情况下,所有传入请求都由此一个实例处理。但是,您还可以让WCF服务使用WCF服务的新实例处理每个传入请求。这使您的服务可以更好地扩展,但可能需要您同步对后端数据存储(例如数据库)的任何访问。您可以使用WCF服务上InstanceContextModeServiceBehaviorAttribute属性来控制此行为。

当我再次阅读你的问题时,听起来你只是在学习WCF,所以我希望这些都不会让你不知所措。查看我对this SO question的回答,了解您可能会发现有用的一些链接。

答案 1 :(得分:1)

要回答您的具体问题,WCF托管基础架构将启动一个HTTP侦听器,该侦听器与HTTP.SYS(IIS使用的相同)一起工作,它将侦听您配置的特定端口/地址上的流量。

对于任何其他问题,我确信this section in MSDN会回答它们。