SignalR:有时协商请求 returns 404 错误(负载平衡)

SignalR: Sometimes Negotiating requests returns 404 error (Load-balanced)

我正在使用 signalR 2.1.2 并将通知推送给我的客户。 前端是负载均衡的。 奇怪的是:有时有效,有时无效。好像和浏览器的类型没有关系。有时在 IE 中有效,有时在 Chrome 中有效。首先我认为传输类型可能是问题,这就是为什么我将传输类型降级为长轮询,不幸的是它没有帮助:

客户端:

$.connection.hub.logging = true; // Enable SignalR logging

$.connection.hub.start({ transport: 'longPolling' }).done(function() {
     console.log("Connected, using transport method: " + $.connection.hub.transport.name);

        }).fail(function() {
            console.log("ERROR! Could not establish SignalR connection");
        });


        $.connection.hub.stateChanged(function(change) {

            if (change.newState === $.signalR.connectionState.disconnected) {
                console.log("State of SignalR connection changed to disconnected");                                       
            } else if (change.newState === $.signalR.connectionState.connected) {
                console.log("State of SignalR connection changed to connected");
            }
        });

$.connection.MessageHub.client.newIncoming = function(id) {
                // server call and that stuff
            }

服务器端:

[HubName("MessageHub")]
    public class MessageNotificationHub : Hub
    {
        // Methods that are implemented here, can be called by the client via ajax and broadcast to every other client

        public override Task OnConnected()
        {
            return base.OnConnected();
        }

    }

在服务器上:

public void Notify(long id)
{
      var notifyHubContext = GlobalHost.ConnectionManager.GetHubContext<MessageNotificationHub>();
            notifyHubContext.Clients.All.newIncoming(id);
}

没什么大不了的,只是看起来像另一个 signalR 样本。

以下是日志中的错误消息:

SignalR:客户端订阅了中心 'messagehub'。 SignalR:正在与“/applicationname/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22messagehub%22%...

协商

错误!无法建立 SignalR 连接

SignalR: 停止连接。

SignalR 连接状态更改为断开连接

解码 URI 显示: https://server/applicationname/signalr/negotiate?clientProtocol=1.4&connectionData=[{"name":"messagehub"}]&_=1426756354570

难不成都是负载均衡部分惹的祸

感谢您的帮助! 谢谢

我发现问题出在 web.config 中缺少机器密钥。因此,网络服务器 A 创建了另一个机器密钥,而不是网络服务器 B 所拥有的。 SignalR 使用机器密钥来验证消息是否来自有效的发件人。 在 web.config 中添加机器密钥后,部署它并关闭所有会话,它工作得很好!