我正在学习 Signal-R,这是我一直以来的想法。
- Signalr 如何融入 IIS/ASP.NET 生命周期?
- 集线器的寿命有多长(我看到它们有重新连接语义)?
- IIS 是否会阻止具有持久连接的 AppDomain 关闭?
据我了解,IIS 旨在处理请求-响应场景。请求到达 IIS,IIS 找到 AppDomain,激活它,然后将请求传递给它。闲置一段时间后,关闭 AppDomain。如果请求时间过长,则会抛出超时异常。
现在让我们想象一下我有另一个通过 TCP 套接字广播信息的应用程序。我希望我的 javascript 客户端能够实时获取该信息,因此我创建了一个 Signal-R Web 应用程序。我可以在应用程序启动时创建 TCP 客户端,但是如何保证 IIS 在不活动一段时间后不会关闭整个应用程序?
我可以在窗口服务中自行托管 Signal-R 应用程序,但随后我必须使用不同的端口、启用跨域等......部署有很多问题。但是,我担心为此使用 ASP.NET MVC 应用程序,因为它在我看来就像在摩托车上安装驱动轮。
Cheers.
IIS/ASP.NET 生命周期中的 SignalR
- SignalR 使用 Owin:http://owin.org/ http://owin.org/
- 这里有一篇关于欧文的好文章:http://msdn.microsoft.com/en-us/magazine/dn451439.aspx 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 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/ http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/
我宁愿让 TCP 客户端在 Windows 服务中运行。 TCP 客户端接收 TCP 广播消息并使用 SignalR .NET 客户端将消息转发到集线器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)