ASP.NET核心中的SignalR落后于Nginx

Art*_*yom 10 nginx signalr asp.net-core

我有一个服务器与ubuntu 16.04,kestrel和nginx作为代理服务器重定向到我的应用程序所在的localhost.我的应用程序在Asp.Net Core 2.我正在尝试添加推送通知和使用SignalR核心.在localhost上一切都运行良好,并在免费托管与iis和Windows.但是当我在linux服务器上部署我的应用程序时,我有一个错误:

signalr-clientES5-1.0.0-alpha2-final.min.js?v = kyX7znyB8Ce8zvId4sE1UkSsjqo9gtcsZb9yeE7Ha10:1个WebSocket连接到'ws://devportal.vrweartek.com/chat?id = 210fc7b3-e880-4d0e-b2d1-a37a9a982c33'失败:WebSocket握手期间出错:意外的响应代码:204

但是只有当我通过我的站点名称从不同的机器请求我的站点时才会出现此错误.当我通过localhost:port从服务器请求站点时,一切都很好.所以我认为nginx存在问题.我读到我需要配置它来处理websocket,这些websocket用于signalr建立连接,但我没有成功.可能只有一些愚蠢的错误?

在此输入图像描述

小智 13

问题是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;
}
Run Code Online (Sandbox Code Playgroud)

你可以阅读我的完整博客文章

https://medium.com/@alm.ozdmr/deployment-of-signalr-with-nginx-daf392cf2b93

  • 他不正是这么说的吗? (3认同)

tri*_*rit 11

我能够通过使用$ 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

我之所以这样做是因为SignalR还试图对我的集线器使用POST和GET请求,所以仅在单独的服务器配置中升级到连接是不够的.

  • FWIW,微软现在有[配置Nginx]的文档(https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-3.1#configure-nginx ) & [Linux with Nginx](https://docs.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/server?view=aspnetcore-3.1#linux-with-nginx) 描述这些。 (4认同)
  • 这也解决了我的情况。另外,不针对集线器的其他请求仍然保留,无需连接升级 (2认同)