我有一台服务器使用ubuntu 16.04,kestrel和nginx作为代理服务器,重定向到我的应用所在的localhost。我的应用程序在Asp.Net Core 2.我正在尝试添加推送通知和使用SignalR核心。在localhost上一切都运行良好,并在免费托管iis和Windows。但是当我在linux服务器上部署我的应用程序时,我有一个错误:
signalr-clientES5-1.0.0-α-2- final.min.js V = kyX7znyB8Ce8zvId4sE1UkSsjqo9gtcsZb9yeE7Ha10:1 WebSocket连接到 'WS://devportal.vrweartek.com/chat ID = 210fc7b3-e880-4d0e-b2d1-a37a9a982c33' 失败:WebSocket握手期间出错:意外的响应代码: 204
但是只有当我通过我的网站名称从不同的机器请求我的网站时才会出现此错误。当我通过localhost:port从服务器请求站点时,一切都很好。所以我认为nginx存在问题。我read我需要配置它来处理在信号器中用于建立连接的websockets,但我没有成功。可能只有一些愚蠢的错误?
答案 0 :(得分:11)
问题是nginx配置文件。如果您使用的是ASP.NET Core部署指南的默认设置,则问题是代理标头之一。 WebSocket需要Connection标头为"升级"。
您必须在nginx配置文件上为SignalR Hub设置新路径。
,例如
location /api/chat {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
您可以阅读我的完整博客文章
https://medium.com/@alm.ozdmr/deployment-of-signalr-with-nginx-daf392cf2b93
答案 1 :(得分:7)
我能够通过使用$ http_connection而不是keep-alive或upgrade
来解决这个问题server {
server_name example.com;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
我之所以这样做是因为SignalR还试图对我的集线器使用POST和GET请求,所以只在单独的服务器配置中升级到连接是不够的。