Signal-R如何适应IIS激活模型?

时间:2013-12-22 12:17:23

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

我正在学习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应用程序,因为它看起来像是在摩托车中安装驱动轮。

干杯。

2 个答案:

答案 0 :(得分:7)

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

中心对象生存期

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

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

因为Hub类的实例是瞬态的,所以不能使用它们来维护从一个方法调用到下一个方法的状态。每次服务器从客户端接收方法调用时,Hub类的新实例都会处理该消息。要通过多个连接和方法调用来维护状态,请使用其他方法,例如数据库,Hub类上的静态变量,或不从Hub派生的其他类。如果将数据保留在内存中,使用Hub类上的静态变量等方法,那么当应用程序域回收时,数据将会丢失。

长时间运行的TCP客户端

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

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

答案 1 :(得分:1)

在每个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