【问题标题】:SignalR .NET Core 2.1 not working on proxied docker containerSignalR .NET Core 2.1 不适用于代理的 docker 容器
【发布时间】:2018-05-13 21:40:19
【问题描述】:

我有一个 .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. 我读到你不应该这样做 1) 在使用 SignalR 时,因为你可能会遇到问题 - 不确定现在是否是这种情况。

我正在捕获 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 应用程序):我看到了:

错误:无法启动连接。错误:找不到可用的传输。

但如果我检查响应:

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

更新

对比一下我在本地运行时得到的响应:

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

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

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

所以我的问题是:

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

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

谢谢!

更新!找到问题了!!!

我写这个是因为我认为这对其他人有用。

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

【问题讨论】:

  • 您的信号器 webapi 是否托管在 https 上的 docker 内?如果不尝试在 https 上托管它,看看是否能解决问题
  • 它托管在一个 Docker 容器上,由 Nginx(另一个 Docker 容器)通过 HTTPS 代理
  • 所以基本上用户需要被授权才能连接到集线器(在类级别应用授权属性)?是否尝试从集线器中删除授​​权以检查在这种情况下连接是否成功?
  • 令牌得到验证,我已经登录。当页面开始加载时,SignalR 连接启动,应用程序失败
  • 对!我只是想确保如果不涉及身份服务器,与集线器的连接将成功,因此可以将问题缩小到身份服务器或信号器

标签: nginx asp.net-core signalr identityserver4 asp.net-core-signalr


【解决方案1】:

我遇到的问题是我在客户端和 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 的运行时版本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多