自托管不需要 Windows 服务。如果您愿意,您可以在控制台应用程序中自行托管。如果您需要 24/7 全天候访问,但出于某种原因不想使用 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 服务上 ServiceBehaviorAttribute 的 InstanceContextMode 属性来控制此行为。
当我再次阅读您的问题时,听起来您只是在学习 WCF,所以我希望这些都没有让您不知所措。查看我对this SO question 的回复,了解一些您可能会觉得有帮助的链接。