【问题标题】:signalR negotiate request returns origianl url in reponse instead of overriden urlsignalR 协商请求返回原始 url 作为响应而不是覆盖 url
【发布时间】:2015-08-14 15:55:36
【问题描述】:

我正在尝试更改 signalR 中的集线器连接 url,以便所有请求都通过我的自定义负载均衡器。

负载均衡器然后重定向到原始 signalR Web 应用程序并给出响应。

为此,我正在尝试通过像这样更改网址来创建新的集线器连接

var signalR = $.signalR;
signalR.hub = $.hubConnection("http://localhost:64071/LoadBalancer.Web/NotificationWeb/signalr", { useDefaultPath: false });

signalR 尝试连接到这个 URL 并在协商请求中返回这个响应

{ "Url":"/WE.abcd.Web/signalr", "ConnectionToken":"raYdZtwHWMP50fYIxa4MxRtR8xZAmUhhdlXreYVlB3Meo+2VeZSk4wMEdbkCbVEAzo/+gFyNofqV ......

然后,正如您在响应中看到的那样,该 URL 包含原始 URL(即 WE.abc.web),因此通信直接发生在 WE.abcd.Web 上,而不是通过我的负载均衡器。即使在覆盖 URL 之后也是 Web。

如何强制协商请求返回 LoadBalancer.Web URL 而不是原始 URL?

【问题讨论】:

  • 这是服务器提供此 URL 的操作:github.com/SignalR/SignalR/blob/master/src/…。不知道为什么它对你的情况很重要 - 客户端无论如何都不使用这个 url。
  • 在我的情况下,客户端正在使用此 URL 进行后续连接请求 这是 negotite localhost:64071/we.abcd.web/signalr/connect 之后的下一个请求?......正如您在 URL 中看到的那样,原始站点名称再次出现.在客户端,我没有给出这个 url,所以它似乎是从协商请求的响应中获取的
  • @PravinS - 我试图更改您指出的代码。我现在使用的是Referer路径,而不是Request localpath。现在工作正常。这是更改后的代码 var referer = context.Request.Headers.Get("Referer"); var originUrl = string.IsNullOrEmpty(referer) ? context.Request.LocalPath : new Uri(referer).LocalPath; var payload = new { Url = originUrl.Replace("/negotiate", ""), ......................... } 我们为什么使用过 Request.LocalPath 吗?
  • @KuldeepBhatnagar 更改后您是否最终构建了自己的 SignalR 库?还是您只为HubDispatcher 创建了子类?我面临同样的问题,我正在尝试避免修改 SignalR 源代码...

标签: signalr load-balancing signalr-hub signalr.client


【解决方案1】:

我认为只要 SignalR 使用Request.LocalPath 生成协商响应 URL,唯一的解决方案就是负载均衡器在将协商响应返回给客户端之前修改协商响应(重写 URL)。这就是反向代理的工作原理。

应该可以在不更改负载平衡器代码的情况下仅使用 IIS URL 重写功能来做到这一点

旁注:我对您的要求\生产环境一无所知,但如果可以从客户端访问负载平衡站点(托管 SignalR)(不隐藏在防火墙\代理后面),则所描述的行为完全没问题。只要负载均衡器是所有服务器之间的平衡协商请求,后续连接请求绕过负载均衡器就没有关系——客户端仍然是平衡的。 + 更少的麻烦,因为您不需要balance Web sockets 连接...

【讨论】:

  • 我不确定负载均衡器是否可以/应该更改任何响应。它可能会更改请求/响应标头,但它应该按原样返回响应。 url 是响应的一部分,负载均衡器是通用的,我们不能在负载均衡器内部有一些特殊的逻辑
  • 我没有说你的代码应该做响应修改。它可以通过使用为负载平衡器站点配置的 IIS URL 重写功能来完成...
  • 是的,我同意使用 URL 重写功能。我会尝试配置它。谢谢您的帮助。
    现在我的第二个问题是在负载均衡环境下轮询请求时得到“”ConnectionId格式不正确。
    在这篇文章中给出了stackoverflow.com/questions/30573063/…
    你能请帮助解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 2019-04-15
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多