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 中添加机器密钥后,部署它并关闭所有会话,它工作得很好!
我正在使用 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 中添加机器密钥后,部署它并关闭所有会话,它工作得很好!