SignalR 错误“无法建立连接,因为目标机器主动拒绝”

问题描述 投票:0回答:2

我有一个带有 AngularJS 前端(客户端)和 Web API 后端(服务器)的单页应用程序(SPA)。我还使用 SignalR 在客户端和服务器之间进行消息传递。在我的开发计算机(使用 IIS Express)上一切正常,但是当部署到服务器进行测试时,在尝试建立与集线器的连接时出现以下错误:

抛出异常:System.Net.Http.HttpRequestException:发送请求时发生错误。 ---> System.Net.WebException: 无法连接到远程服务器 ---> System.Net.Sockets.SocketException: 无法建立连接,因为目标计算机主动拒绝它 127.0.0.1:60161 在 System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult) 在 System.Net.ServicePoint.ConnectSocketInternal(布尔 connectFailure、Socket s4、Socket s6、Socket& 套接字、IPAddress& 地址、ConnectSocketState 状态、IAsyncResult asyncResult、Exception& 异常) --- 内部异常堆栈跟踪结束 --- 在 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在 System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar) --- 内部异常堆栈跟踪结束 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 C:\Users...\CreateRequestService.cs 中的 CMR.Messaging.PublisherService.CreateRequestService.d__7.MoveNext() 处:第 143 行

即使它从客户端成功连接到 SignalR 集线器:

我的客户端 SignalR 代码的相关部分是这样的(在 AnglarJS 服务中):

    // Setting up the SignalR hub
    var hub = new Hub("reportHub", {
        listeners: {
            'newConnection': function (id) {
            },
            'broadcastReportProgress': function (reportProgress) {

                Reports.add(reportProgress[0].clientName, reportProgress[0].folderPath, reportProgress[0].reportName, reportProgress[0].status, reportProgress[0].userName);
                $rootScope.$apply();
            },
            'broadcastUserGenerating': function(reportProgress) {
                Reports.addActiveUser(reportProgress.clientName, reportProgress.status, reportProgress.userName);
                $rootScope.$apply();
            }
        },
        methods: ['send'],
        errorHandler: function(error) {
            console.error(error);
        },
        hubDisconnected: function () {
            if (hub.connection.lastError) {
                hub.connection.start();
            }
        },
        transport: 'webSockets',
        logging: true,
        queryParams: { userName: authService.authentication.userName },

        rootPath: 'http://localhost:60161/signalr'
    });

错误发生在以下代码片段中,该代码片段位于尝试建立与 SignalR 集线器的连接的 Window Service 中(错误行对应于上面错误消息中的“CreateRequestService.cs:line 143”):

        try
        {
            IList<ReportProgress> generationProgress = new List<ReportProgress>();
            generationProgress.Add(new ReportProgress
            {
                ClientName = clientName,
                FolderPath = response.FolderPath,
                ReportName = response.Response,
                Status = "InProgress",
                UserName = response.UserName
            });

            var hubConnection = new HubConnection("http://localhost:60161/signalr", false);
            IHubProxy reportHubProxy = hubConnection.CreateHubProxy("ReportHub");

            **await hubConnection.Start(); --> ERROR OCCURS HERE**

            await reportHubProxy.Invoke("SendReportProgress", generationProgress);
            await reportHubProxy.Invoke("SendUserGenerating", generationProgress[0]);
        }
        catch (Exception ex)
        {
            throw new Exception(nameof(this.GetType) + " ****Exception**** ", ex);
        }

SignalR 中心位于我的 Web API 项目中:

以下是 Web API 项目的项目属性。这是设置端口号 60161 的地方。由于跨域兼容性,此数字与我的 SPA 运行的端口不同:

知道为什么会发生这种情况吗?

c# asp.net angularjs asp.net-web-api signalr
2个回答
6
投票

经过多次调试,我终于找到了问题所在。事实上,这里有两个不同的问题在起作用。首先,由于代码已部署到测试服务器,因此不应在任何地方使用“localhost”。相反,应使用带有后缀“signalr”的测试服务器的 URL,即类似“http://testserver.companyname.com/signalr”的内容。其次,在我的客户端 SignalR 集线器代码中,我有以下行:

transport: 'webSockets'

这导致了一个问题,因为在我们的测试服务器上未启用 Web 套接字,因此没有可供使用的传输。当我注释掉该行代码后,它就开始工作了,但它使用服务器端事件 (SSE) 进行传输,因为 Web 套接字不可用。当我们进入 IIS 并安装并启用它们后,它开始使用 Web Sockets 而不是 SSE。 这就是这个棘手问题的解决方案。希望这对其他人有帮助,这样他们就不必花我(大约)两天的时间来弄清楚。


0
投票

我在使用 Azure SignalR 本地模拟器时遇到了同样的问题。这是由于模拟器生成/读取的

UrlTemplate
文件的
settings.json
字段中使用了不正确的端口号造成的。此端口号需要与本地 SignalR 中心使用的端口号相匹配(在我的例子中,它是我在本地运行的 Azure 函数的 SignalR 触发器)。

© www.soinside.com 2019 - 2024. All rights reserved.