【发布时间】: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 的横向扩展功能(如 here 或 here 所述)。客户端只连接到一个(随机)服务器(工作角色实例)并与服务器通信,直到发送关闭消息。如果他再次连接,他可以被路由到任何其他服务器。服务器之间也没有通信。
更新/解决方案
halter73 是对的,每个实例都会生成自己的反 CSRF 令牌。为了避免这种情况,我实现了自己的 IDataProtector/IDataProtectionProvider,类似于 SO 问题(请参阅here 和 here)。
【问题讨论】:
标签: azure signalr azure-worker-roles