0

我有一个像这样分层的应用程序:WPF -> WCF -> BLL -> DAL -> DB。WCF 层启动 SignalR 主机。BLL 使用 SignalR 通知客户端。WPF 是接收 SignalR 通知的客户端。

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

我有两个问题:

  1. 有什么我做错了(见下面的代码)?我想也许localhost在配置文件中使用可能是一个问题,但谷歌搜索并没有对此有所了解。
  2. 此类问题的典型故障排除程序是什么?我不知道从哪里开始。

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"/>
4

1 回答 1

1

经过进一步的研究和反复试验,该问题localhost在服务器的配置中使用。

我不得不改变这个:

<add key="signalrAddress" value="http://localhost:8084"/>

对此:

<add key="signalrAddress" value="http://servername:8084"/>

这个问题在这里解释。

URL 用于打开 HttpListener。使用上面的 URL(本地主机),这个 HttpListener 将 http://localhost只接受来自的请求。其他等效的 URL 不起作用:

http://127.0.0.1
http://110.120.130.140
http://myserver
于 2013-05-31T01:33:00.103 回答