SignalR - WebSocket握手期间出错:意外响应代码:504

时间:2017-05-19 12:17:35

标签: javascript signalr signalr.client

我正在尝试连接信号器集线器,但我在javascript中收到以下错误:

WebSocket connection to 'ws://dev:777/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=%2BRUC9XodaU4R3Wn3BSLfhZXxLqeLj9fp4XlLJSsxrc36dFuEo6O9GOIGYMdsgSeswY2DTzzJe9qCe9JnqgjwusbYROxjkY%2B6d9FD4MVpox4FLEqNzCF5Y%2BOqrY5ndNs%2FRl7aOoKIYelpGmerXj4mdw%3D%3D&connectionData=%5B%7B%22name%22%3A%22machinehub%22%7D%5D&tid=5' failed: Error during WebSocket handshake: Unexpected response code: 504

然后在控制台

Could not connect. Invocation of StartMachine failed. Error: No transport could be initialized successfully. Try specifying a different transport or none at all for auto initialization.

我正在使用这样的代码从hub调用我的方法:

 self.Run = function (action, parameters, callbacks) {
    try {
        var connection = $.hubConnection();
        connection.logging = self.Debug;
        var hub = connection.createHubProxy(self.Name);

        registerConnectionEvents(connection);
        registerEvents(hub, callbacks);

        connection.start({ transport: ['webSockets'] })
            .done(function () {
                self.debug("Now connected!");

                hub.invoke.apply(hub, $.merge([action], parameters)).fail(function (error) {
                    var msg = 'Invocation of ' + action + ' failed. ' + error;
                    self.debug(msg);
                });                   
            })
            .fail(function (error) {
                var msg = 'Could not connect. Invocation of ' + action + ' failed. ' + error;
            self.debug(msg);
        });

        return true;
    }

当我在Visual Studio中使用signalr运行我的MVC5应用程序时,一切都很好。在Windows Server 2012上发布到IIS8后,无法通过信号r中的Web套接字进行连接。我试图关闭两个防火墙进行测试但没有成功。你能帮我解决这个问题吗?当然,我在该页面上阅读了https://docs.microsoft.com/en-us/aspnet/signalr/

1 个答案:

答案 0 :(得分:1)

为了使SignalR能够与WebSocket一起正常工作,您必须确保客户端和服务器都支持WebSocket。如果本地测试工作正常,那么您的浏览器可能已经支持它了。

Windows Server 2012支持SignalR,但您需要确保启用了websockets功能:

enter image description here

如果已启用此功能,请尝试回收应用程序池(或重置IIS)。

如果回收/重置不充分,那么您可能在服务器和客户端之间有其他东西,例如代理服务器或其他安全层,例如网络防火墙(您可能不会)它可以访问它),它可能存在于企业环境中,或者存在于亚马逊等可能阻塞端口的地方的服务器中。