客户端没有接收到SignalR消息

本文关键字:SignalR 消息 客户端 | 更新日期: 2023-09-27 18:15:26

我一直在尝试让我的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);
    }

客户端没有接收到SignalR消息

虽然我仍然在努力理解如何以及为什么,但我能够让它工作。泰勒·马伦给我指出了正确的方向。除了他在客户端的建议外,我还必须更改一些服务器代码,即使用空的hub和简化的Startup类。

我中心

:

public class PrestoHub : Hub{}

注意: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();
}

您正在创建一个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(){ }