我正在学习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应用程序,因为在我看来,它就像将驱动轮安装在摩托车中。
干杯。
最佳答案
IIS / ASP.NET生命周期中的SignalR
SignalR使用Owin:http://owin.org/
关于Owin的一篇很好的文章:http://msdn.microsoft.com/en-us/magazine/dn451439.aspx
集线器对象寿命
从SignalR文档:http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#transience:
您无需实例化Hub类或从服务器上自己的代码中调用其方法; SignalR集线器管道为您完成了所有这些工作。 SignalR每次需要处理Hub操作时(例如客户端连接,断开连接或对服务器进行方法调用时),都会创建一个新的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客户端将消息转发到集线器。
关于asp.net - Signal-R如何适合IIS激活模型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20729285/