【问题标题】:SignalR on multiple Windows Azure instances (no backplane)多个 Windows Azure 实例上的 SignalR(无背板)
【发布时间】:2014-11-20 13:47:42
【问题描述】:

我目前正在开发一个使用 WebAPI 和 SignalR 进行通信的 Windows Azure 应用程序。这两个服务都通过 OWIN 托管在具有多个实例的 Worker 角色上。

当前解决方案

目前,我们在每台机器的 443 端口上启动一个带有 WebAPI 的 Owin 主机,在每台机器上的 instance input endpoint 端口(例如 10106-1010x)上启动一个 SignalR Owin 主机。

一切正常,但我们的一些客户坐在防火墙后面,除 80/443 之外的所有端口都被阻止 -> 所以那里没有 websocket 通信(WebAPI 工作正常)。

新解决方案

我们将在每个实例上使用 WebAPI 和 SignalR 启动一个 Owin 主机。因此 HTTP 和 WebSocket 流量都将通过负载均衡器通过端口 443 进行路由 -> 不再有实例输入端点(也不再有防火墙问题)。

问题

现在的问题是,有时可以建立 WebSocket 连接,有时则不能(与浏览器无关)。如果无法建立连接,控制台会出现以下错误:

Error during WebSocket handshake: Unexpected response code: 400
No transport could be initialized successfully. Try specifying a different transport or none at all for auto initialization.

我已经将角色实例 ID 添加到来自服务器的 websocket 响应消息中,但是无法找到任何 (ir) 规则(例如,单个实例不响应,.. .)。所有 SignalR 服务器似乎都已启动并运行,但有时无法建立连接。

您可以前往以下 link 自行测试。如果您没有收到错误对话框(“与服务器的连接丢失”),则说明它正在工作,否则请尝试多次刷新页面。

-

不是在寻找 SignalR 的横向扩展功能(如 herehere 所述)。客户端只连接到一个(随机)服务器(工作角色实例)并与服务器通信,直到发送关闭消息。如果他再次连接,他可以被路由到任何其他服务器。服务器之间也没有通信。


更新/解决方案

halter73 是对的,每个实例都会生成自己的反 CSRF 令牌。为了避免这种情况,我实现了自己的 IDataProtector/IDataProtectionProvider,类似于 SO 问题(请参阅herehere)。

【问题讨论】:

    标签: azure signalr azure-worker-roles


    【解决方案1】:

    如果您可以查看 400 响应的内容(这可能很困难,因为它是对 WebSocket 请求的 SSL 加密响应),您可能会看到类似于“ConnectionId 格式不正确”的消息。

    SignalR 使用服务器的机器密钥来创建反 CSRF 令牌,但这需要您场中的所有服务器共享一个机器密钥,以便在 SignalR 请求跃点服务器时正确解密该令牌。 /negotiate 是检索反 CSRF 令牌的请求。当 SignalR 客户端随后使用反 CSRF 令牌发出 /connect 请求时,当 /connect 请求由未创建令牌的不同服务器处理时,它有时会失败,因此无法解密它。

    这是一个遇到类似问题的人在 GitHub 上提交的问题:https://github.com/SignalR/SignalR/issues/2292

    【讨论】:

    • 谢谢你的回答,我一回来就调查这个问题。
    猜你喜欢
    • 2014-08-13
    • 2012-03-04
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多