2012-03-30 45 views
3

我需要一個後臺線程做一些工作,並通過SignalR向連接到服務的用戶發送數據。IIS後臺線程和SignalR

我想在IIS中託管這個線程,並在Application_Start首次命中時產生它,或者在單獨的工作進程中產生它。

如果我將它託管在IIS中並在應用程序的開始創建它 - 線程僅在應用程序第一次命中時啓動。我一開始服務就需要它運行。 - 我無法通過桌面GUI控制此線程,我無法以簡單的方式停止或暫停它。

如果我是主持人在一個單獨的過程中,如Windows服務 - 我沒有訪問SignalR服務實例 - 我不想連接到SignalR服務爲用戶將數據發送給其他用戶。我想了一個不同的方法來解決這個問題,並不意味着工作人員是SignalR本身的客戶。

你對此有何評論?你有沒有看到其他解決方案?

+1

不希望服務充當用戶的原因是什麼?你如何期望在IIS中的後臺線程上連接到集線器(壞主意,你可以看看http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in -asp-net.aspx) – redsquare 2012-03-30 16:38:52

+0

原因是安全性和速度 – 2012-03-30 17:22:23

+0

安全性?你可以使用Windows身份驗證,速度?什麼是客戶端慢? – redsquare 2012-03-31 06:20:48

回答

2

我們已經接近的方法是在您的Windows服務可以調用的Web應用程序上創建一個單獨的端點。

想象一下,ASP.NET MVC控制器中存在以下URI:http:// [myserver]/api/TellUsers/[msg]。在此方法內部,您可以獲取連接的集線器客戶端並撥打電話。

[HttpPut] 
public void TellUsers(string msg) 
{ 
    var connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>(); 
    var demoClients = connectionManager.GetClients<MyHubDerivedClass>(); 
    demoClients.TellUsers(msg); 
} 

[插入警告有關正確這裏的錯誤檢查。]

當然,你不必使用MVC。任何公共訪問的URI都可以工作。至於保護它,您可以使用任何有效的技術來保護ASP.NET端點。

0

我知道這個問題是比較舊的,但:

說實話我比較喜歡的「客戶端本身」例如,你有。這使您可以從多個不同的點進行控制,而不僅僅是一個。例如 - 多個服務可以調用來控制服務。我看不出有任何理由,您不能擁有能夠調用其他用戶無法執行的「特殊」命令的管理員用戶。

對許多系統來說,這是一個久經考驗的設計。我會堅持下去。