SignalR .NET Core 2.1 不适用于代理 docker 容器

SignalR .NET Core 2.1 not working on proxied docker container

我有一个 .NET Core 2.1 Web API(使用 2.1.0-preview1-final)在本地使用 SignalR 1.0.0-preview1-final 运行良好。我在前端使用一个 Angular 应用程序,它有包 "@aspnet/signalr": "1.0.0-preview1-final" 所以一切都匹配,当我在本地 运行 程序时,我的 HTTP 端点和集线器都按预期工作。

当我部署到我的虚拟服务器时,我有一个 Nginx 反向代理,它向它背后的所有应用程序发送请求。我正在使用 Docker,当我们部署整个生态系统的 v1.0 时,我在其他项目中没有遇到任何问题。

我在这个特定场景中的不同之处有两个:

  1. 我有使用 AspNetIdentity 的 IdentityServer4,必须从 Nginx 配置中删除 proxy_buffering off 选项才能使其正常工作(在 https://andrewlock.net/fixing-nginx-upstream-sent-too-big-header-error-when-running-an-ingress-controller-in-kubernetes/ 之后)
  2. 我读到你不应该在使用 SignalR 时执行 1) 因为你可能会遇到问题 - 不确定现在是否是这种情况。

我正在捕获 API 的日志,我可以看到当我尝试连接到集线器时我回来了:

info: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[4]
      Policy execution successful.
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[2]
      Successfully validated the token.
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1]
      Authorization was successful.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 7.4652ms 200 application/json

所以我假设这是正确的。现在在客户端(Angular 应用程序):我看到了这个:

Error: Failed to start the connection. Error: No available transports found.

但如果我检查响应:

{"connectionId":"nHzKKYtp0ITwlEntjqLprA","availableTransports":[{"transport":"WebSockets","transferFormats":["Text","Binary"]},{"transport":"ServerSentEvents","transferFormats":["Text"]},{"transport":"LongPolling","transferFormats":["Text","Binary"]}]}

更新

比较本地 运行ning 时的响应我得到:

{"connectionId":"4ea7b1ea-8754-472b-baef-527073872d2a","availableTransports":["WebSockets","ServerSentEvents","LongPolling"]}

也就是说传输格式没有限制?也不确定这是否相关......这很奇怪,这里发生的事情是一样的:

------更新结束--------

所以我的问题是:

我是否因为设置了 proxy_buffer 而中断了 SignalR 连接?如果是这样,有没有办法让 IS4 和 SignalR 运行ning 在同一个 Nginx 实例后面? - 为了让事情变得更困难,我使用了一个 Nginx 模板,该模板是使用 docker-gen.

自动生成的

如果我对 Nginx 的更改不应该破坏 SignalR,为什么不建立连接?

谢谢!

更新!找到问题了!!!

我写这篇文章是因为我认为它对其他人有用。

我遇到的问题是我在客户端和 API 上都使用了 preview1,但是在我创建 Dockerfile 的那一天,我无法获得 FROM microsoft/dotnet:2.1.0-preview1-aspnetcore-runtime 工作所以我选择使用 preview2: FROM microsoft/dotnet:2.1.0-preview2-aspnetcore-runtime 这就是问题所在。现在我快速更改了客户端和 API 以使用 SignalR 的预览,并且我可以使连接正常工作。快乐的时光!希望这个 el 有用 :) 所以不仅客户端和 API 需要匹配,实际的 docker 图像也需要对齐。

我遇到的问题是我在客户端和 API 上都使用了 preview1 但在我创建 Dockerfile 的那一天我无法使用 FROM microsoft/dotnet:2.1.0-preview1-aspnetcore-runtime 因为我有元数据问题(取自错误)所以我选择使用 preview2: FROM microsoft/dotnet:2.1.0-preview2-aspnetcore-runtime 这就是问题所在。现在我快速更改了客户端和 API 以使用 SignalR 的预览,并且我可以使连接正常工作。快乐的时光!希望这个 el 有用 :) 所以不仅客户端和 API 需要匹配,实际的 docker 图像也需要对齐。

因此,请确保在创建图像时同步您的客户端版本、网络核心信号器版本和 Dockerfile 的运行时版本