2013-05-25 220 views
5

我一直試圖讓我的WPF客戶端應用程序接收WCF服務發送的SignalR消息。我已經嘗試了很多東西,現在已經採取行動,希望能夠發揮某些作用。我在線上關注了教程和示例,並且我無法讓我的WPF OnSignalRMessage()方法被調用。 我在哪裏錯了?客戶端沒有收到SignalR消息

我的樞紐:

public class PrestoHub : Hub 
{ 
    public void Send(string message) 
    { 
     Clients.All.OnSignalRMessage(message); 
    } 
} 

我的啓動類:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var config = new HubConfiguration { EnableCrossDomain = true }; 

     app.MapHubs("http://localhost:8084", config); 
    } 
} 

啓動(我的WCF服務主機內)我SignalR主機的方法:

private void StartSignalRHost() 
    { 
     const string url = "http://localhost:8084"; 
     WebApplication.Start<Startup>(url); 
    } 

代碼實際發送一些消息:

GlobalHost.ConnectionManager.GetHubContext<PrestoHub>().Clients.All.OnSignalRMessage("snuh"); 
Console.WriteLine("Sent 'snuh' to all clients..."); 

我的WPF客戶端的方法:

private void InitializeSignalR() 
    { 
     var hubConnection = new Connection("http://localhost:8084"); 
     hubConnection.Start(); 
     hubConnection.Received += OnSignalRMessage; 
    } 

    private void OnSignalRMessage(string data) 
    { 
     MessageBox.Show(data); 
    } 

回答

3

雖然我仍然在努力理解如何和爲什麼,我能得到它的工作。 +1給泰勒馬倫指出我正確的方向。除了他在客戶端的建議外,我還必須更改一些服務器代碼,即使用空集線器和簡化的Startup類。

我的樞紐:

public class PrestoHub : Hub{} 

注意:集線器是空的,因爲我們不是要求在它的方法。我們稍後會看到,我們獲取集線器上下文並將消息發送給客戶端。

我的啓動類:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapHubs(); 
    } 
} 

上面的代碼似乎正是解決了這一問題。這也適用於:

var config = new HubConfiguration { EnableCrossDomain = true }; 
app.MapHubs(config); 

但只要我指定一個URL,我的客戶不接收消息(試過有和沒有「SignalR」部分):

app.MapHubs("http://localhost:8084/SignalR", config); 

的方法啓動我的SignalR主機(我的WCF服務主機內):

private void StartSignalRHost() 
{ 
    const string url = "http://localhost:8084"; 
    WebApplication.Start<Startup>(url); 
} 

代碼實際發送一些信息:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>(); 
hubContext.Clients.All.OnSignalRMessage("snuh"); 

我的WPF客戶端的方法:

private void InitializeSignalR() 
{ 
    var hubConnection = new HubConnection("http://localhost:8084"); 
    var prestoHubProxy = hubConnection.CreateHubProxy("PrestoHub"); 
    prestoHubProxy.On<string>("OnSignalRMessage", (data) => 
     { 
      MessageBox.Show(data); 
     }); 
    hubConnection.Start(); 
} 
+0

爲什麼指定一個URL導致您的應用程序失敗的原因:https://github.com/SignalR/SignalR/issues/962 –

+0

所以這是因爲我指定了完整的URL?如果我想改變它,我需要做這樣的事情? 'MapHubs( 「〜/ SignalR2」)' –

1

你正在創建一個PersistentConnection不是集線器連接。爲了從PrestoHub獲取消息,首先需要連接HubConnection,然後您需要處理事件「OnSignalRMessage」。

所以,你的客戶端代碼現在看起來像:

private void InitializeSignalR() 
{ 
    var hubConnection = new HubConnection("http://localhost:8084"); 
    var prestoHubProxy = hubConnection.CreateHubProxy("PrestoHub"); 

    // Bind the "OnSignalRMessage" to a function 
    prestoHubProxy.On<string>("OnSignalRMessage", (data) => { 
     MessageBox.Show(data); 
    }); 

    hubConnection.Start(); 
} 
+0

其實用'HubConnection'是我的嘗試之一。我剛剛嘗試過你的代碼示例,並且'MessageBox.Show()'沒有被擊中。 –

+0

確保您的MapHubs正在被擊中,並且如果它是在Web瀏覽器中轉到http:// localhost:8084/signalr/hubs並查看您是否獲得了JavaScript文件。 –

+0

MapHubs被擊中,但該頁面不會在瀏覽器中出現。我只是打印了SignalR電子書。我會閱讀並做更多的疑難解答。感謝您的提示。 –

0

如果你的服務器端方法是異步確保他們返回的任務,而不是無效的。這是你應該有

public async Task Method(){ } 

,而不是

public async void Method(){ } 
相關問題