SignalR - 调用从自托管控制台服务器
问题描述:
一个WPF客户端方法,我也跟着this教程和管理,以建立一个客户端 - >服务器和服务器 - >客户端实时通信演示。但是,当试图在WPF项目(而不是控制台项目)中重新创建相同的场景时,我似乎无法从SignalR Hub调用WPF项目的方法。SignalR - 调用从自托管控制台服务器
注:的WPF项目和自托管控制台项目都在相同 Visual Studio解决方案
SignalR枢纽:(在自主机服务器控制台项目)
public class TestHub : Hub
{
public void NotifyAdmin_Signup()
{
Clients.All.NotifyStation_Signup();
//This should call the WPF Project's NotifyStation_Signup() method
}
}
启动服务器&从同一个控制台调用集线器方法:
个class Program
{
static void Main(string[] args)
{
//Start the Local server
string url = @"http://localhost:8080/";
using (WebApp.Start<Startup>(url))
{
Console.WriteLine(string.Format("Server running at {0}", url));
Console.ReadLine();
}
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<TestHub>();
hubContext.Clients.All.NotifyAdmin_Signup();
}
}
MainWindow.xaml.cs在WPF项目:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var hubConnection = new HubConnection("http://localhost:8080/");
IHubProxy _hub = hubConnection.CreateHubProxy("TestHub");
hubConnection.Start().Wait();
//Call a local method when the Server sends a signal
_hub.On("NotifyStation_Signup", x => PrintAccountCount());
}
//This never gets called :(
private void PrintAccountCount()
{
//Display a Message in the Window UI
var dispatcher = Application.Current.Dispatcher;
dispatcher.Invoke(() => counter_accounts.Content = "I got the signal!");
}
}
有NO错误。 WPF项目的'NotifyStation_Signup'方法永远不会被服务器调用。我究竟做错了什么?
答
尝试注册事件之前您启动集线器连接。
var hubConnection = new HubConnection("http://localhost:8080/");
IHubProxy _hub = hubConnection.CreateHubProxy("TestHub");
//Call a local method when the Server sends a signal
_hub.On("NotifyStation_Signup", x => PrintAccountCount());
hubConnection.Start().Wait();
答
解决了!我通过调用using()方法之外的集线器方法犯了一个愚蠢的错误:
static void Main(string[] args)
{
//Start the Local server
string url = @"http://localhost:8080/";
using (WebApp.Start<Startup>(url))
{
Console.WriteLine(string.Format("Server running at {0}", url));
//Instead of having the following two lines outside of this,
//I put it in here and it worked :)
IHubContext hubContext =
GlobalHost.ConnectionManager.GetHubContext<TestHub>();
hubContext.Clients.All.NotifyAdmin_Signup();
Console.ReadLine();
}
}
相同的结果。不会被叫做兄弟 – Dinuka