客户端未收到SignalR消息

Bob*_*orn 6 c# wpf wcf signalr

我一直在尝试让我的WPF客户端应用程序接收WCF服务发送的SignalR消息.我已经尝试了许多东西,并且现在已经采取行动,希望有些东西可行.我已经在线跟踪了教程和示例,我根本无法得到我的WPF OnSignalRMessage()方法来调用.我在哪里错了?

我的中心:

public class PrestoHub : Hub
{
    public void Send(string message)
    {
        Clients.All.OnSignalRMessage(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的启动课:

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

        app.MapHubs("http://localhost:8084", config);
    }
}
Run Code Online (Sandbox Code Playgroud)

启动SignalR主机的方法(在我的WCF服务主机中):

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

实际发送一些消息的代码:

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

我的WPF客户端方法:

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

    private void OnSignalRMessage(string data)
    {
        MessageBox.Show(data);
    }
Run Code Online (Sandbox Code Playgroud)

Bob*_*orn 3

虽然我仍在努力理解其方式和原因,但我能够让它发挥作用。+1 感谢 N. Taylor Mullen 为我指明了正确的方向。除了他在客户端的建议之外,我还必须更改一些服务器代码,即使用空集线器和简化的启动类。

我的中心:

public class PrestoHub : Hub{}
Run Code Online (Sandbox Code Playgroud)

注意:中心是空的,因为我们没有调用其中的方法。正如我们稍后将看到的,我们获取集线器上下文并向客户端发送消息。

我的启动课程:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapHubs();
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码似乎解决了问题。这也有效:

var config = new HubConfiguration { EnableCrossDomain = true };
app.MapHubs(config);
Run Code Online (Sandbox Code Playgroud)

但是,一旦我指定了 URL,我的客户端就不会收到消息(尝试使用或不使用“SignalR”部分):

app.MapHubs("http://localhost:8084/SignalR", config);
Run Code Online (Sandbox Code Playgroud)

启动我的 SignalR 主机(在我的 WCF 服务主机内)的方法:

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

实际发送一些消息的代码:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>();
hubContext.Clients.All.OnSignalRMessage("snuh");
Run Code Online (Sandbox Code Playgroud)

我的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();
}
Run Code Online (Sandbox Code Playgroud)