2015-05-29 28 views
2

我有一個使用SignalR集線器向網站用戶發送消息的ASP.NET網站。發送SignalR在同一臺服務器上從Windows服務在ASP.NET MVC應用程序中運行的廣播

我有調用業務層中的集線器的代碼,我使用依賴注入將集線器的實例從我的ASP.NET應用程序注入到業務層。

我遇到的問題是當我在Windows服務中使用我的業務層時,我不知道如何獲取集線器的實例。

是否有可能從服務器'掛鉤'到我現有的SignalR集線器中,這些集線器正在我的ASP.NET應用程序中運行並從我的Windows服務中發送廣播?

我意識到,我可以連接如使用下面的代碼我的Windows服務中的客戶端,但這是圍繞走錯了路,我想從服務器發送廣播......

// This code enables a client connection 
var connection = new HubConnection("http://localhost:3537/"); 
IHubProxy myHub = connection.CreateHubProxy("NotificationHub"); 

connection.Start().Wait(); 

myHub.Invoke("setNotificationCount", "5"); 
+0

是代碼列出你連接作爲客戶端或您嘗試從服務器廣播? – Pseudonym

+0

列出的代碼是作爲C#應用程序的客戶端連接的。我想連接,但能夠從服務器上從同一臺服務器上運行的Windows服務進行廣播。 – Luke

+0

啊,這比我想象的要複雜一點,嗯,我發佈了一個答案,但我不知道現在會有多大的幫助...仍在調查 – Pseudonym

回答

1

你的集線器在ASP.NET託管應用。因此,沒有,沒有辦法,你可以直接從Windows服務廣播...不使用SignalR的scaleout功能...

解決方案1(不使用scaleout - 首選)

Windows服務連接到集線器作爲客戶端運行在APS.NET應用程序(hub1)中,並調用向所有客戶端廣播消息的特殊集線器方法。 OFC這種方法可能會被普通(瀏覽器)客戶濫用。爲了消除這種情況,您可以在ASP.NET應用程序中創建另一個集線器(hub2),將該方法放置在此處並使用GlobalHost.ConnectionManager.GetHubContext<hub1>()向連接到hub1的所有客戶端廣播。 Hub2可以被保護by authorization,所以只有Windows服務才能使用它。 由於您已經在使用DI容器並在您的業務邏輯中注入集線器,應該很容易定義通用接口(INotificationService)並創建兩個不同的實現 - 首先將用於ASP.NET應用程序內部(使用Hub1執行實際通知)第二個將在Windows服務中使用,並使用Hub2將通知傳遞給ASP.NET應用程序。從BL的角度來看,它同樣的東西... ...

OFC for Win服務 - > ASP.NET通信,你可以使用任何其他通信技術,如MVC或WebAPI(如@推薦的假名),而不僅僅是SignalR

解決方案2

如果這不是爲您解決由於某些原因,還有另外一個想法。 我認爲SignalR scaleout feature可以(誤)在這裏使用。只需將您的hub1 均寄存在ASP.NET 內部的 Windows服務(使用不同的URL和端口!)。即使客戶端將僅直接連接到ASP.NET應用程序,在Windows服務中運行的代碼仍然能夠向他們廣播消息(消息傳遞到擴展消息總線,然後傳遞給ASP.NET應用程序,然後傳遞給客戶端)。您需要鎖定Windows服務中心,以便客戶端無法直接連接到它並運行hub1方法(我需要SQL Server \ Redis或任何其他SignalR背板+延遲等)我不知道該怎麼做 - 一個想法是使用另一個集線器實現,但具有相同的名稱(HubNameAttribute)和空方法+授權,因此沒有人可以連接到它)。 無論如何,這是更麻煩,你應該有很好的理由走這條路線...

+0

感謝你的這一點,我打算進入SignalrR集線器,或者使用WebAPI,我認爲它帶有一些基本的安全性。 – Luke

1

編輯:所以根據我們的討論,這裏是我的問題的理解:

問題: 有可以訪問的SignalR客戶,這有利於現有項目ject需要響應與具有這些客戶端的項目在同一服務器上運行的Windows服務事件。

我的解決方案: 我會構建或利用webAPI項目充當服務和服務器項目之間的角色。該服務可以調用webAPI方法,然後訪問您的業務級邏輯,然後根據需要更新SignalR客戶端。這也具有使Microsoft提供的內置保護可用的優點(即,任何認證方案:窗體,窗口等)。


方式this教程解釋是,爲了給播報給客戶,你首先需要獲得引用到所有連接的客戶端。

GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients)有例如如何退回

從那裏,你需要做一些事情,如客戶名單(再次使用他們的例子):Clients.All.SomeClientMethod(string aParameter)

+0

謝謝您花時間回答。這可以從ASP.NET應用程序中實現,但不幸的是不是來自不同的項目,比如Windows服務器。 – Luke

+0

是的,我看到了你的評論,我正在研究它 – Pseudonym

相關問題