簡體   English   中英

客戶端未收到SignalR消息

[英]SignalR message not being received on the client

我一直在嘗試讓我的WPF客戶端應用程序接收WCF服務發送的SignalR消息。 我已經嘗試了很多事情,現在又采取了黑客行動,希望有些事情能奏效。 我已經在線上閱讀了教程和示例,但是我根本無法調用WPF OnSignalRMessage()方法。 我在哪里錯了?

我的中心:

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);
    }
}

啟動SignalR主機(在WCF服務主機內)的方法:

    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);
    }

雖然我仍在努力了解操作方式和原因,但仍能夠使它正常工作。 +1對N. Taylor Mullen指出正確的方向。 除了他在客戶端的建議外,我還必須更改一些服務器代碼,即使用空集線器和簡化的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”部分和不使用“ 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();
}

您正在創建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();  
}

如果服務器端的方法是異步的,請確保它們返回一個任務而不是void。 那是你應該有的

public async Task Method(){ }

並不是

public async void Method(){ }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM