阅读WCF我们有自己的托管选项,这里的一个限制是我们必须自己管理主机进程生命周期。我在这里探索的是在没有IIS的情况下运行服务并进行自托管。
很少有事情可以想到 - 请求管理如何在这里工作。在IIS的情况下,它管理请求并控制特定线程上的dotnet。如果没有IIS,我们需要自己编写代码来管理传入的请求(例如在tcp端口上),或者WCF提供了一些类来管理请求并产生线程来处理每个线程。
由于 直流
答案 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服务上InstanceContextMode
的ServiceBehaviorAttribute
属性来控制此行为。
当我再次阅读你的问题时,听起来你只是在学习WCF,所以我希望这些都不会让你不知所措。查看我对this SO question的回答,了解您可能会发现有用的一些链接。
答案 1 :(得分:1)
要回答您的具体问题,WCF托管基础架构将启动一个HTTP侦听器,该侦听器与HTTP.SYS(IIS使用的相同)一起工作,它将侦听您配置的特定端口/地址上的流量。
对于任何其他问题,我确信this section in MSDN会回答它们。