SignalR:WebSocket 握手期间出错:意外的响应代码:400

17

我刚开始使用SignalR。 我已经使用signalr在我的网站上实现了实时数据反映。 当尝试连接WebSocket时,控制台上会出现“Web-Socket握手期间的错误:意外响应代码:400”错误。

应用程序使用Asp.net MVC - SignalR 2.0.3开发,并托管在Windows Server 2012 - IIS 8上。

我从此链接找到了一个解决方案。

它说我们需要将网站指向HTTPS(并提供SSL),然后http才能使用web-socket。我的问题也得到了解决。 我的疑问是 - 我们不能在不使用HTTPS的情况下解决此问题吗? 因为并非每个网站都需要托管在HTTPS上(需要SSL)。


2
您的网站可能通过HTTP提供服务,而WebSocket则通过SSL(WSS)连接。这是一种正常/可行的方案... - Malkocoglu
我的请求只指向 ws://*,而不是在控制台错误中显示的 wss://*。 - Roshni Shah
我不知道SignalR的工作原理,但我知道可以通过HTTP提供HTML并通过SSL提供websocket。 - Malkocoglu
5个回答

35

在你的web.config文件中使用这个标签:

<httpRuntime maxRequestLength="40960" targetFramework="4.5" requestValidationMode="2.0" />

<system.web>标签下。描述您的目标框架。错误将会消失。


11
@DanielMinnaar,当然!因为这是微软的原因。 - Oleg Grishko

5
我在使用带有 Angular 8 前端的 .Net Core Web API 时遇到了相同的问题。在我的情况下,问题是服务器上未安装 Websocket 协议。通过从服务器管理器中的“添加角色和功能”安装它,问题得以解决。

enter image description here


这对我也适用。 Ionic + .Net Core + SignalR 应用程序 - Miguel Carrillo
这对我也适用。Vue + .Net Core + SignalR 应用程序 - Andy Wijaya

5
如果问题是客户端到服务器路径中存在代理,那么您只能向提供商(客户端和服务器)投诉,无法做其他事情。 HTML5 Web Sockets如何与代理服务器交互 通过使用安全连接,您可以确保没有代理会干扰您的连接。

2
这种400错误也可能发生在您在负载均衡器后运行多个服务器的情况下。检查400响应的正文(例如,使用Fiddler),看看是否找到了这个:ConnectionId格式不正确。如果是这样,那么您的问题可能是每个应用程序服务器上未使用相同的机器密钥。
有关解决方案的详细信息,请参见此答案:https://dev59.com/AJnga4cB1Zd3GeqPXl4K#43479474

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不是问题。在HTTPS页面上将自动使用WSS,而在HTTP上使用WS,无需任何手动设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接