我的应用分层如下:WPF - > WCF - > BLL - > DAL - > D B。 WCF层启动SignalR主机。 BLL使用SignalR通知客户端。 WPF是接收SignalR通知的客户端。
我的问题是它可以在我的笔记本电脑上运行,但是,相同的代码,当部署到分布式环境(WPF在我的笔记本电脑上运行而WCF在另一台服务器上运行)时,不会导致WPF客户端获得SignalR通知。
我有两个问题:
localhost
可能是一个问题,但谷歌搜索没有说明这一点。WCF主机启动SignalR:
private void StartSignalRHost()
{
var url = ConfigurationManager.AppSettings["signalrAddress"];
WebApplication.Start<Startup>(url);
}
BLL调用SignalR:
private static void OnDatabaseItemAdded(object sender, EventArgs<string> e)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>();
hubContext.Clients.All.OnDatabaseItemAdded("snuh");
}
WPF客户端收到SignalR通知:
private void InitializeSignalR()
{
var signalrAddress = ConfigurationManager.AppSettings["signalrAddress"];
var hubConnection = new HubConnection(signalrAddress);
var prestoHubProxy = hubConnection.CreateHubProxy("PrestoHub");
prestoHubProxy.On<string>("OnDatabaseItemAdded", OnDatabaseItemAdded);
hubConnection.Start();
}
private void OnDatabaseItemAdded(string data)
{
Refresh();
}
配置文件中包含以下内容:
注意:localhost
将替换为WPF配置中的服务器名称。
<add key="signalrAddress" value="http://localhost:8084"/>
答案 0 :(得分:1)
经过进一步研究和反复试验,问题是在服务器配置中使用localhost
。
我不得不改变这个:
<add key="signalrAddress" value="http://localhost:8084"/>
对此:
<add key="signalrAddress" value="http://servername:8084"/>
问题解释为here。
该URL用于打开HttpListener。使用上面的URL( localhost一个)这个HttpListener将接受来自的请求 仅
http://localhost
。其他等效的URL不起作用:
http://127.0.0.1
http://110.120.130.140
http://myserver