2013-05-30 64 views
0

我有一個像這樣分層的應用程序:WPF - > WCF - > BLL - > DAL - > DB。 WCF層啓動SignalR主機。 BLL使用SignalR通知客戶。 WPF是接收SignalR通知的客戶端。我的問題是,它在我的筆記本電腦上工作,但是,當部署到分佈式環境(WPF在我的筆記本電腦上運行,WCF在另一臺服務器上運行)時,它的相同代碼不會導致WPF客戶端獲得SignalR通知。NET客戶端分佈式場景中的SignalR故障排除

我有兩個問題:

  1. 有什麼事我做不正確的(見下面的代碼)?我想可能在配置文件中使用localhost可能是一個問題,但是谷歌搜索沒有揭示任何亮點。
  2. 什麼是這樣的典型故障排除程序?我不知道從哪裏開始。

WCF主機開始SignalR:

private void StartSignalRHost() 
    { 
     var url = ConfigurationManager.AppSettings["signalrAddress"]; 
     WebApplication.Start<Startup>(url); 
    } 

BLL調用SignalR:

private static void OnDatabaseItemAdded(object sender, EventArgs<string> e) 
    { 
     var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>(); 
     hubContext.Clients.All.OnDatabaseItemAdded("snuh"); 
    } 

WPF客戶端接收SignalR通知:

private void InitializeSignalR() 
    { 
     var signalrAddress = ConfigurationManager.AppSettings["signalrAddress"]; 
     var hubConnection = new HubConnection(signalrAddress); 
     var prestoHubProxy = hubConnection.CreateHubProxy("PrestoHub"); 
     prestoHubProxy.On<string>("OnDatabaseItemAdded", OnDatabaseItemAdded); 
     hubConnection.Start(); 
    } 

    private void OnDatabaseItemAdded(string data) 
    { 
     Refresh(); 
    } 

的配置文件有這樣的在其中:

注:localhost被替換爲WPF配置的服務器名稱。

<add key="signalrAddress" value="http://localhost:8084"/> 
+0

請問您樞紐覆蓋的名字嗎?如果不是,SignalR喜歡重新命名集線器,例如「prestoHub」。 –

+0

另外,您是否驗證過客戶端實際連接到服務器? –

+0

@JoelLucsy它沒有。 PrestoHub類沒有任何屬性。它在本地工作。我認爲這可能是一個權限問題,因爲我的筆記本電腦與WCF服務器不在同一個域中。但我只是在猜測這一點。 –

回答

1

經過進一步研究和反覆試驗,問題是在服務器的配置中使用了localhost

我不得不改變這一點:

<add key="signalrAddress" value="http://localhost:8084"/> 

要這樣:

<add key="signalrAddress" value="http://servername:8084"/> 

問題解釋here

The URL is used to open an HttpListener. With the URL above (the localhost one) this HttpListener will accept requests from http://localhost only. Other, equivalent URLs do not work:

http://127.0.0.1 
http://110.120.130.140 
http://myserver