我正在学习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
Hub对象的生命周期
来自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的问题.您的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客户端将消息转发到集线器.