在.NET客户端分布式方案中对SignalR进行故障诊断

时间:2013-05-30 19:13:48

标签: c# signalr

我的应用分层如下:WPF - > WCF - > BLL - > DAL - > D B。 WCF层启动SignalR主机。 BLL使用SignalR通知客户端。 WPF是接收SignalR通知的客户端。

我的问题是它可以在我的笔记本电脑上运行,但是,相同的代码,当部署到分布式环境(WPF在我的笔记本电脑上运行而WCF在另一台服务器上运行)时,不会导致WPF客户端获得SignalR通知。

我有两个问题:

  1. 我做错了什么(见下面的代码)?我想可能在配置文件中使用localhost可能是一个问题,但谷歌搜索没有说明这一点。
  2. 对于这样的事情,典型的故障排除程序是什么?我不知道从哪里开始。
  3. 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"/>
    

1 个答案:

答案 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