[英]SignalR message not being received on the client
我一直在尝试让我的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对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”部分和不使用“ 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();
}
您正在创建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();
}
如果服务器端的方法是异步的,请确保它们返回一个任务而不是void。 那是你应该有的
public async Task Method(){ }
并不是
public async void Method(){ }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.