【问题标题】:how to selfhost wcf without iis如何在没有 iis 的情况下自托管 wcf
【发布时间】:2010-03-26 17:12:50
【问题描述】:

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

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

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

谢谢 直流

【问题讨论】:

    标签: wcf


    【解决方案1】:

    自托管不需要 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 服务上 ServiceBehaviorAttributeInstanceContextMode 属性来控制此行为。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-10
        • 1970-01-01
        • 2011-08-02
        相关资源
        最近更新 更多