【发布时间】: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 时,我在其他项目中没有遇到任何问题。
我在这个特定场景中的区别有两个:
- 我有使用 AspNetIdentity 的 IdentityServer4,必须从 Nginx 配置中删除
proxy_buffering off选项才能使其正常工作(遵循 https://andrewlock.net/fixing-nginx-upstream-sent-too-big-header-error-when-running-an-ingress-controller-in-kubernetes/) - 我读到你不应该这样做 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