【问题标题】:How does Signal-R fit in the IIS activation model?Signal-R 如何适应 IIS 激活模型?
【发布时间】:2014-03-28 17:38:18
【问题描述】:

我正在学习 Signal-R,这是我一直在想的东西。

  • Signal-R 如何适应 IIS/ASP.NET 生命周期?
  • 集线器的寿命有多长(我看到它们具有重新连接语义)?
  • IIS 是否会阻止关闭具有持久连接的 AppDomain?

据我了解,IIS 旨在处理请求-响应方案。一个请求命中 IIS,它会找到 AppDomain,激活它,然后将请求传递给它。并在空闲时间后关闭 AppDomain。如果请求时间过长,则会抛出超时异常。

现在让我们假设我有另一个通过 TCP 套接字广播信息的应用程序。我希望我的 javascript 客户端能够实时获取该信息,因此我创建了一个 Signal-R Web 应用程序。我可以在应用程序启动时创建 TCP 客户端,但什么能保证 IIS 在一段时间不活动后不会关闭整个系统?

我可以在窗口服务中自行托管 Signal-R 应用程序,但随后我将不得不使用不同的端口、启用跨域等......部署时会遇到很多问题。但是,我担心为此使用 ASP.NET MVC 应用程序,因为在我看来它就像在摩托车上安装驱动轮。

干杯。

【问题讨论】:

    标签: asp.net .net iis-7.5 signalr


    【解决方案1】:

    IIS/ASP.NET 生命周期中的 SignalR

    中心对象生命周期

    来自 SignalR 文档:http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#transience

    您无需实例化 Hub 类或从您自己的服务器代码调用其方法; SignalR Hubs 管道为您完成的所有工作。 SignalR 每次需要处理 Hub 操作(例如客户端连接、断开连接或对服务器进行方法调用时)都会创建 Hub 类的新实例。

    由于 Hub 类的实例是瞬态的,因此您不能使用它们来维护从一个方法调用到下一个方法调用的状态。每次服务器接收到来自客户端的方法调用时,您的 Hub 类的新实例都会处理该消息。要通过多个连接和方法调用来维护状态,请使用其他方法,例如数据库,或 Hub 类上的静态变量,或不是从 Hub 派生的不同类。如果你在内存中持久化数据,使用Hub类上的静态变量等方法,应用域回收时数据会丢失。

    您长期运行的 TCP 客户端

    这不是 SignalR 的问题。您的 TCP 客户端可以被 IIS 关闭:http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/

    我宁愿让 TCP 客户端在 Windows 服务中运行。 TCP 客户端接收 TCP 广播消息并使用 SignalR .NET 客户端将消息转发到集线器。

    【讨论】:

      【解决方案2】:

      每个 SignalR 请求都会重新创建集线器,因此如果您需要持久连接,您可能需要考虑使用静态变量或字典来保持状态。但是正如您所指的 ASP.NET 可以由于多种原因重新启动。

      这取决于您真正需要的持久性。如果您的连接必须始终保持活动状态并且不能被拆除和重新建立,那么在 IIS 中托管不是正确的选择。但是,如果您可以在关机后重新建立相同的连接,那么也许这仍然可以工作。

      您可以做很多事情来确保 ASP.NET 应用程序不会在最新版本的 IIS 中关闭:

      http://weblog.west-wind.com/posts/2013/Oct/02/Use-IIS-Application-Initialization-for-keeping-ASPNET-Apps-alive

      如果这还不足以让您作为单独的服务运行是一种选择。如果您在同一 IP 地址上作为服务运行,则没有跨域问题。以下是有关使用 Windows 服务运行 SignalR 的更多信息:

      http://weblog.west-wind.com/posts/2013/Sep/04/SelfHosting-SignalR-in-a-Windows-Service

      【讨论】:

      • 无论是否使用静态变量,WebSocket 都是持久连接。我认为您可能对持久状态感到困惑:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2019-09-15
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多