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

lf3rwulv  于 12个月前  发布在  Angular
关注(0)|答案(2)|浏览(152)

我有一个单页应用程序(SPA),带有AngularJS前端(客户端)和Web API后端(服务器)。我还使用SignalR在客户端和服务器之间进行消息传递。在我的开发机器上一切正常(使用IIS Express),但是当部署到服务器进行测试时,我在尝试建立到集线器的连接时遇到以下错误:
抛出的异常:System.Net.Http.HttpRequestException:发送请求时出错。- > System. Net. WebException:无法连接到远程服务器-> System. Net. Sockets. SocketException:无法建立连接,因为目标计算机在System上主动拒绝连接127.0.0.1:60161。Net.套接字。插座。系统端连接(IAsyncResult和IAsyncResult)。. ServicePoint. ConnectSocketInternal(Boolean connectFailure,Socket s4,Socket s6,Socket & socket,IPAddress & address,ConnectSocketState state state,IAsyncResult,Exception & exception)-内部异常堆栈跟踪结束-在系统。Net. HttpWebRequest.系统上的EndGetResponse(IAsyncResult)。Net. Http. HttpClient服务器。GetResponseCallback(IAsyncResult ar)-内部异常堆栈跟踪结束-在系统。-是的销售服务。任务等待。ThrowForNonSuccess(任务)在系统中。-是的销售服务。任务等待。在C中的CMR.Messaging.PublisherService.RequestService.d__7.MoveNext()处处理非同步和同步通知(任务任务):\用户...\n请求服务。政务司司长:第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中(错误行对应于上面错误消息中的"HTTP RequestService. 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 hub位于我的Web API项目中:

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

知道为什么会这样吗

rbpvctlc

rbpvctlc1#

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

transport: 'webSockets'

这导致了一个问题,因为在我们的测试服务器上没有启用Web套接字,因此没有传输可供使用。一旦我注解掉那行代码,它就开始工作了,但是它使用服务器端事件(SSE)进行传输,因为Web套接字不可用。在我们转到IIS并安装和启用它们之后,它开始使用Web Sockets而不是SSE。所以你有它,解决这个棘手的问题。希望这将帮助别人,所以他们不必花(约)2天,我没有弄清楚。

bvuwiixz

bvuwiixz2#

对于任何在使用Azure Function和SignalR触发器时遇到相同错误的人......我在使用Azure SignalR Local Emulator时遇到了相同的错误。这是由于在settings.json文件的UrlTemplate字段中使用了不正确的端口号导致的,模拟器从该文件中生成/读取。此端口号需要与本地SignalR集线器使用的端口号相匹配(在我的情况下,它是本地运行的Azure函数的SignalR触发器)。

相关问题