2014-06-23 65 views
1

我想使用Azure來託管我的Web應用程序,例如CloudService Web角色或Azure網站,在應用程序內使用SignalR連接客戶端和服務器。SignalR在Azure中的多個實例

由於我爲我的Web角色縮放了兩個實例,看起來我遇到了一個非常普遍的問題,SignalR無法找到正確的原始實例。客戶端JavaScript表示它已經啓動,但服務器中樞OnConnected事件隨機不會引發,所以打算由客戶端調用的服務器方法也是如此,所有這些奇怪的問題都是隨機發生的。

一旦我將實例更改爲一個,所有問題都消失了。所以任何人都可以解釋當客戶端調用服務器方法時發生了什麼,爲什麼有時服務器似乎沒有正確響應?

我找到了post,Azure Service Bus能解決這個問題嗎?

回答

2

是的,你需要使用天藍色的服務總線。否則,連接將存儲在給定服務器上的內存中,而另一臺服務器則不會了解它們。一旦創建了服務總線,只需在啓動類中引用它即可。

public void Configuration(IAppBuilder app) 
{ 
    System.Diagnostics.Trace.TraceInformation("SignalR Startup > Configurtion start"); 
    // Any connection or hub wire up and configuration should go here 
    string connectionString = "XXX"; 
    GlobalHost.DependencyResolver.UseServiceBus(connectionString, "TopicName"); 

    ... 
} 

您還需要在每個集線器的方法來獲取上下文的引用:

var context = GlobalHost.ConnectionManager.GetHubContext<HubName>(); 

這是易peasy :)

+0

謝謝,我還是不解的一兩件事:連接是否僅在原始實例中存在,或者是否存在創建爲客戶端調用的實例響應的新連接? –

+0

連接來自客戶端...生成客戶端ID,並且該客戶端ID用於通信,直到用戶更改頁面(對於JavaScript客戶端)。該ID將用於發送到該客戶端的所有消息。如果用戶更改頁面,則會生成新的客戶端ID。 – KingOfHypocrites

+0

因此,假設連接存儲在實例A(不使用ServiceBus),那麼客戶端調用服務器方法,實例B佔據了位置,實例B是否會創建新的集線器實例來響應請求或者根本就不能響應? –