客户端未收到 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 消息的主要内容,如果未能解决你的问题,请参考以下文章