SignalR:有时谈判请求返回404错误(负载平衡)

问题描述:

我使用signalR 2.1.2,并且我正在向我的客户端推送通知。 前端负载均衡。 奇怪的是:有时它起作用,有时它不起作用。它似乎与浏览器的类型没有任何关系。有时它在IE中有效,有时在Chrome中可用。首先,我认为,交通的类型可能是问题,这就是为什么我降级的传输类型来长轮询,遗憾的是它并没有帮助:SignalR:有时谈判请求返回404错误(负载平衡)

客户端:

$.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); 
} 

没什么大不了的,只是看起来像另一个SI gnalR样品。

下面是从日志中的错误消息:

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=[ { “名”: “messagehub”}] & _ = 1426756354570

难道负载均衡的部分会导致所有我的烦恼。

我感谢您的帮助! Thx

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