【问题标题】:SignalR message not being received on the client客户端未收到 SignalR 消息
【发布时间】: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);
    }

【问题讨论】:

    标签: c# wpf wcf signalr


    【解决方案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(){ }
    

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 2020-10-15
      • 1970-01-01
      • 2020-08-13
      • 2016-04-29
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多