【问题标题】:SignalR with IIS 10 and ARR 3.0SignalR 与 IIS 10 和 ARR 3.0
【发布时间】:2020-01-16 15:53:07
【问题描述】:

在我们的 Visual Studio 开发机器前使用 ARR 3.0 作为反向代理时,我们无法让 SignalR 工作。连接已成功建立,但是一旦建立连接,应从 SignalR 服务器发送的初始帧从未发送,事实上,无法发送任何帧,这会导致客户端断开 WebSocket 连接。综上所述,“websocket连接可以建立,但是不能传帧”。

MVC 应用无需反向代理即可工作。

我们已在以下主题中尝试了所有建议的解决方案:

“协商”请求的屏幕截图。

“连接”请求的屏幕截图。

编辑 1

似乎正在发送已连接的帧,但在路上失败了。可以通过 Wireshark 在环回上看到。

编辑 2

当我没有将后缀附加到 url 时,SignalR 似乎可以与 ARR 一起使用。换句话说:

【问题讨论】:

  • 如果您使用安全的 webSockets 是否有效? (即使用 https 而不是 http 协议开始连接)
  • 很遗憾没有。

标签: asp.net asp.net-mvc iis signalr arr


【解决方案1】:

因此,我们设法解决了相关问题,并深入挖掘了根本原因,以便能够清楚地重现问题。它与完成重写的顺序有关,我们所做的是我们在 ASP.NET MVC 应用程序中创建了一个辅助方法,如果来自发起请求的 HTTP 标头包含我们的重写路径,它将重写输入参数 URL后缀。

public static class RouteHelper
{
    public static string Url(string url)
    {
        string orginalUrl = HttpContext.Current?.Request.Headers["X-Original-URL"];
        if (!string.IsNullOrEmpty(orginalUrl))
        {
            if (orginalUrl.StartsWith("/" + "portal", true, CultureInfo.InvariantCulture)
                || orginalUrl.StartsWith("portal", true, CultureInfo.InvariantCulture))
            {
                url = "/" + "portal" + url;
            }
        }
        return url;
    }
}

我们使用此方法设置 SignalR 集线器/连接的 URL,如下所示:

$.connection.hub.url = '@RouteHelper.Url("/signalr")'

结果将是 $.connection.hub.url = '@RouteHelper.Url("/portal/signalr")'

很容易认为这会产生与创建出站重写规则相同的结果,但这是不正确的。

代理返回给客户端的响应是一样的,但是代理和后端网络服务器之间的通信会发生故障。

相反,我们为此创建了一个出站规则,如下所示:

<rule name="SignalRReverseProxySignalRHubsUrl">
    <match filterByTags="None" pattern="connection.hub.url.*=.*['\&quot;](.*)['\&quot;]" />
    <action type="Rewrite" value="connection.hub.url = &quot;/portal{R:1}&quot;" />
</rule>

我无法解释导致 SignalR 帧未到达的反向代理和后端 Web 服务器之间内部发生的情况,但我可以确认所有 URL 重写都需要在代理和模拟应用程序中的逻辑上完成相同的重写将无法正常工作,至少不能以上述方式。

【讨论】:

  • 我试图就此提出一个问题,但在这里发布的内容有点详细且冗长。如果可能的话,你能看看这里的帖子,让我知道你的想法。 TY
猜你喜欢
  • 2017-10-20
  • 1970-01-01
  • 2014-09-01
  • 2017-11-13
  • 2022-12-15
  • 2013-07-21
  • 2014-04-18
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多