我刚开始使用SignalR。我使用signalr在我的网站上实现了实时数据反射。当尝试连接web-socket时,控制台上出现“Web-Socket握手期间出错:意外响应代码:400”错误。
应用程序是使用Asp.net MVC开发的 - signalR 2.0.3并托管在Windows Server 2012上 - IIS 8
找到了一个解决方案它说我们需要网站指向HTTPS(并利用SSL),然后http才能使用网络套接字。我的问题也解决了。我的疑问是 - 我们不能在不使用HTTPS的情况下解决这个问题?由于每个网站可能不需要在HTTPS上托管(需要SSL)。
答案 0 :(得分:26)
在web.config文件中使用此标记:
<httpRuntime maxRequestLength="40960" targetFramework="4.5" requestValidationMode="2.0" />
<system.web>
标记下的。 描述你的目标框架。错误将消失
答案 1 :(得分:4)
如果问题是从客户端到服务器的路径中存在的代理,除了向您的提供商(客户端和服务器)投诉之外,您无法做任何事情。
How HTML5 Web Sockets Interact With Proxy Servers
通过使用安全连接,您可以确保没有代理会弄乱您的连接。
答案 2 :(得分:4)
答案 3 :(得分:1)
如果您在负载均衡器后面的多个服务器上运行,也会发生此400错误。检查400响应的正文(例如,使用Fiddler)并查看是否找到了这个:The ConnectionId is in the incorrect format
。如果是这样,那么您的问题可能是您没有在每个应用程序服务器上使用相同的机器密钥。
有关解决方案的详细信息,请参阅此答案:https://stackoverflow.com/a/43479474/979202
答案 4 :(得分:0)
如果您落后于Nginx,请添加以下三行(以proxy_
开头的行):
server {
listen 443; # Or 80 or whatever
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
...
}
HTTPS / HTTP不是问题。无需任何手动设置,WSS将自动在HTTPS页面上使用,而WS在HTTP上使用。