signalR negotiate request返回origianl url in reponse而不是overriden url

时间:2015-06-01 08:51:01

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

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

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

为此,我试图通过改变这样的URL来创建一个新的集线器连接

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上,而不是通过我的Load Balancer。即使覆盖了URL,也可以使用Web。

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

1 个答案:

答案 0 :(得分:0)

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

应该可以在不使用IIS URL重写功能

更改负载均衡器代码的情况下执行此操作

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