我有一个独特的情况。我开发了一个MVC 4网站和.NET客户端,它连接到托管SignalR集线器的站点。 hubConnection对象成功连接到集线器。但是,如果我调用hubProxy.Invoke(“Test”),创建的hubProxy对象根本不返回.Wait();我的枢纽简单地返回了一个真实的bool;
有趣的是,当我通过VS和IIS express在本地运行网站和.net客户端时,一切正常。当我在完整的2008R2 IIS 7.5服务器和笔记本电脑上的.net客户端上运行网站时,它会失败。或者更恰当的是,线程只是停在HubProxy.Invoke(“Test”)。Wait()并且永远不会返回(它只是继续运行)。
更有趣的部分是当我开始运行Fiddler以查看正在发生的事情或者呼叫是否通过Web服务器时,问题会自行解决并且一切正常。
似乎不知何故fiddler充当我的.net客户端的代理使hubProxy.Invoke()工作。如果我需要代理,我会认为我的HubConnection对象会失败?能够成功连接到集线器连接只是为了意识到线程似乎永远运行试图在集线器代理上调用一个函数,这有点误导?
有人可以澄清这种行为吗?关于在.net客户端正确创建HubConnection / Proxy以调用服务器上的方法需要做些什么的建议?
此外,这可能相关也可能不相关。我注意到如果我将我的网站托管为:
http {s} // mywebsiteserver / mywebsite“我可以通过网络浏览器浏览,它不能用作信号连接字符串。我必须使用完全限定的DNS名称
HTTP {S} // mywebsiteserver.mydomainname.xyz/mywebsite
有什么建议吗?
谢谢! 麦克
答案 0 :(得分:7)
在我看来,在启动HubConnection
或进行任何操作之前,您需要在.NET客户端中将ServicePointManager.DefaultConnectionLimit
设置为大于默认值2的值其他HTTP请求。我发现10是运行单个SignalR HubConnection
的合理限制。
通常,SignalR只有2个或更少的同时HTTP连接,但情况并非总是如此。我发现运行Fiddler有时会隐藏这个问题,但我不确定原因。
答案 1 :(得分:0)
另一种解释是您需要仔细检查您的网址。
让我们说您的中心位于 site.com ,并且 www.site.com 您有 301重定向到site.com。
然后,当您使用
时,SignalR似乎建立了连接_hubConnection = new HubConnection("http://www.yoursite.com/signalr");
但在这种情况下你必须使用
_hubConnection = new HubConnection("http://yoursite.com/signalr");
否则_hubConnection.Start似乎有效,但_proxy.Invoke没有。我自己犯了这个错误。 :)
答案 2 :(得分:0)
还要确保您在服务器上定义的方法不是静态的。 我自己遇到了这个问题。
答案 3 :(得分:0)
在我的情况下,我收到此Web请求错误"请求失败,HTTP状态为417:期望失败。"
我在客户端使用
解决了这个问题ServicePointManager.Expect100Continue = false;
了解更多: http://www.codeproject.com/Articles/94235/The-request-failed-with-HTTP-status-417-Expectatio