簡體   English   中英

Signal-R如何適應IIS激活模型?

[英]How does Signal-R fit in the IIS activation model?

我正在學習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

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客戶端將消息轉發到集線器。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM