【发布时间】: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