客户端未收到 SignalR 消息

Posted

技术标签:

【中文标题】客户端未收到 SignalR 消息【英文标题】:SignalR message not being received on the client 【发布时间】:2013-05-21 03:32:46 【问题描述】:

我一直试图让我的 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】:

虽然我仍在努力理解其方式和原因,但我能够让它发挥作用。 +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”部分):

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

【讨论】:

指定 URL 导致应用程序失败的原因:github.com/SignalR/SignalR/issues/962 所以是因为我指定了完整的 URL?如果我想改变它,我需要做这样的事情吗? MapHubs("~/SignalR2")【参考方案2】:

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

【讨论】:

实际上,使用HubConnection 是我的尝试之一。我刚刚尝试了您的代码示例,MessageBox.Show() 没有被击中。 确保您的 MapHubs 被点击,如果它被点击,请在网络浏览器中转到 localhost:8084/signalr/hubs 并查看您是否获得了 javascript 文件。 MapHubs 被点击,但该页面不会出现在浏览器中。我刚刚打印了 SignalR 电子书。我会阅读并进行更多故障排除。感谢您的提示。【参考方案3】:

如果您在服务器端的方法是异步的,请确保它们返回一个任务而不是 void。那是你应该有的

public async Task Method() 

而不是

public async void Method() 

【讨论】:

以上是关于客户端未收到 SignalR 消息的主要内容,如果未能解决你的问题,请参考以下文章

SignalR

自定义 SignalR 的错误消息

SignalR 广播消息在停止/启动后重复

ASP.NET Core Angular - 根据登录用户发送不同的 SignalR 消息

SignalR:同步组加入

SignalR HubConnectionState = 正在连接