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

问题描述:

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

想到很少的东西 - 请求管理如何在此工作。在IIS的情况下,它管理请求并在特定线程上对dotnet进行控制。在没有IIS的情况下,我们需要自己编写代码来管理传入的请求(比如在一个tcp端口上),或者WCF提供一些类来管理请求并生成线程来处理每个线程。

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

感谢 DC

自托管不要求一个Windows服务。如果您愿意,您可以在控制台应用程序内自行托管。只是如果您需要全天候访问,但不希望出于任何原因使用IIS,则Windows服务是自托管的一个很好的解决方案。

管理主机进程的生命周期并不是什么大事。我使用Windows服务来托管WCF服务。我只是在OnStart()回调我的Windows服务的启动我的WCF服务,像这样:

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

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

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

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

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

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

为了回答您的具体问题,WCF托管基础设施将旋转了一个HTTP侦听与HTTP.SYS(同样的事情IIS使用),将交通监听的具体工作您配置的端口/地址。

对于任何其他问题,我相信this section in MSDN将回答他们。