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

Posted

技术标签:

【中文标题】在 .NET 客户端分布式方案中对 SignalR 进行故障排除【英文标题】:Troubleshooting SignalR in a .NET Client Distributed Scenario 【发布时间】:2013-05-30 19:13:48 【问题描述】:

我有一个像这样分层的应用程序:WPF -> WCF -> BLL -> DAL -> DB。 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"/>

【问题讨论】:

您的集线器是否覆盖了名称?如果不是,SignalR 喜欢重命名集线器,例如“prestoHub”。 另外,你确认客户端确实连接到服务器了吗? @JoelLucsy 它没有。 PrestoHub 类没有属性。它在本地工作。我认为这可能是权限问题,因为我的笔记本电脑与 WCF 服务器位于不同的域中。但我现在只是猜测。 如何验证客户端是否实际连接?当我单步执行客户端上的代码时,没有发生异常。 hubConnection.Start().Wait(); 【参考方案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

【讨论】:

以上是关于在 .NET 客户端分布式方案中对 SignalR 进行故障排除的主要内容,如果未能解决你的问题,请参考以下文章

关于.net core 中的signalR组件的使用

使用 .NET 客户端时的 SignalR 传输

ASP.NET Core SignalR :SignalR Javascript 客户端

如何确定与 SignalR 客户端的服务器断开连接?

ASP.NET Core SignalR 下:SignalR Javascript 客户端

.net core 3.0 Signalr - 01 基础篇