C# 客户端上未接收到信号器消息

C# 客户端上未接收到信号器消息,c#,wpf,wcf,signalr,C#,Wpf,Wcf,Signalr,我一直在尝试让我的WPF客户端应用程序接收WCF服务发送的信号器消息。我已经尝试了很多东西,现在已经求助于黑客,希望有什么东西能起作用。我已经在线学习了教程和示例,但我无法调用我的WPF OnSignalRMessage()方法我的错误在哪里? 我的中心: public class PrestoHub : Hub { public void Send(string message) { Clients.All.OnSignalRMessage(message);

我一直在尝试让我的WPF客户端应用程序接收WCF服务发送的信号器消息。我已经尝试了很多东西,现在已经求助于黑客,希望有什么东西能起作用。我已经在线学习了教程和示例,但我无法调用我的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);
    }
}
启动我的信号机主机(在我的WCF服务主机内)的方法:


您正在创建的是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();  
}
private void initializeSignal()
{
var hubConnection=新的hubConnection(“http://localhost:8084");
var prestoHubProxy=hubConnection.CreateHubProxy(“PrestoHub”);
//将“OnSignalRMessage”绑定到函数
prestoHubProxy.On(“OnSignalRMessage”(数据)=>{
MessageBox.Show(数据);
});
hubbonnection.Start();
}

虽然我仍在努力理解它的工作原理和原因,但我还是能够让它正常工作+感谢N.泰勒·马伦为我指出了正确的方向。除了他在客户端的建议之外,我还必须更改一些服务器代码,即使用一个空集线器和一个简化的启动类

我的中心:

public class PrestoHub : Hub{}
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapHubs();
    }
}
private void StartSignalRHost()
{
    const string url = "http://localhost:8084";
    WebApplication.Start<Startup>(url);
}
var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>();
hubContext.Clients.All.OnSignalRMessage("snuh");
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();
}
注意:中心是空的,因为我们没有在其中调用方法。正如我们稍后将看到的,我们获取中心上下文并向客户端发送消息

我的创业班:

public class PrestoHub : Hub{}
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapHubs();
    }
}
private void StartSignalRHost()
{
    const string url = "http://localhost:8084";
    WebApplication.Start<Startup>(url);
}
var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>();
hubContext.Clients.All.OnSignalRMessage("snuh");
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();
}
上面的代码似乎解决了这个问题。这也适用于:

var config = new HubConfiguration { EnableCrossDomain = true };
app.MapHubs(config);
但是,一旦我指定了URL,我的客户端就不会收到消息(尝试使用或不使用“信号器”部分):

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

public class PrestoHub : Hub{}
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapHubs();
    }
}
private void StartSignalRHost()
{
    const string url = "http://localhost:8084";
    WebApplication.Start<Startup>(url);
}
var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>();
hubContext.Clients.All.OnSignalRMessage("snuh");
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();
}
private void StartSignalRHost()
{
常量字符串url=”http://localhost:8084";
WebApplication.Start(url);
}
实际发送消息的代码:

public class PrestoHub : Hub{}
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapHubs();
    }
}
private void StartSignalRHost()
{
    const string url = "http://localhost:8084";
    WebApplication.Start<Startup>(url);
}
var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>();
hubContext.Clients.All.OnSignalRMessage("snuh");
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();
}
var-hubContext=GlobalHost.ConnectionManager.GetHubContext();
hubContext.Clients.All.OnSignalRMessage(“snuh”);
我的WPF客户端方法:

public class PrestoHub : Hub{}
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapHubs();
    }
}
private void StartSignalRHost()
{
    const string url = "http://localhost:8084";
    WebApplication.Start<Startup>(url);
}
var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>();
hubContext.Clients.All.OnSignalRMessage("snuh");
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();
}
private void initializeSignal()
{
var hubConnection=新的hubConnection(“http://localhost:8084");
var prestoHubProxy=hubConnection.CreateHubProxy(“PrestoHub”);
prestoHubProxy.On(“OnSignalRMessage”(数据)=>
{
MessageBox.Show(数据);
});
hubbonnection.Start();
}

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

public async Task Method(){ }
而不是

public async void Method(){ }

实际上,使用
HubConnection
是我的尝试之一。我刚刚尝试了您的代码示例,但未命中
MessageBox.Show()
。请确保您的MapHubs正在被命中,如果它在web浏览器中被转到,请查看是否得到javascript文件。MapHubs正在被命中,但浏览器中不会出现该页面。我刚打印了信号员电子书。我会读这篇文章并做更多的故障排除。感谢您提供的提示。指定URL导致应用程序失败的原因:那是因为我指定了完整的URL?如果我想改变它,我需要这样做<代码>映射集线器(“~/SignalR2”)