SignalR 无法使用 docker compose/container 进行连接
SignalR can't connect using docker compose/container
我在 docker 上建立 SignalR 连接时遇到问题(IIS 运行良好)。
主要目标是 运行 docker 编写数据并将其从 nodeRed 容器发送到 webApp(.net core 3.1 Blazor),反之亦然。我建立了 docker 网络并成功地将两个容器放在那里。
问题是我的 SignalR 连接失败并显示“连接被拒绝”。我看这会有些陈词滥调,但找不到。
page.razor
protected override async Task OnInitializedAsync()
{
hubConnection = new HubConnectionBuilder()
.WithUrl("http://AICsystemApp/nodeRedHub")
.Build();
hubConnection.On<string, string>("ReceiveCommand", (user, message) =>
{
var encodedMsg = $"{destination}: {message}";
nodeRedOutput.Add(encodedMsg);
StateHasChanged();
});
await hubConnection.StartAsync();
}
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80 /* tried 8024 */
EXPOSE 443 /* tried 44324 */
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["AICsystemApp/AICsystemApp.csproj", "AICsystemApp/"]
RUN dotnet restore "AICsystemApp/AICsystemApp.csproj"
COPY . .
WORKDIR "/src/AICsystemApp"
RUN dotnet build "AICsystemApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "AICsystemApp.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "AICsystemApp.dll"]
docker-compose.override.yml
version: '3.4'
services:
aicsystemapp:
container_name: AICsystemApp
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
ports:
- "8024:80"
- "44324:443"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
networks:
- my-network
networks:
my-network:
external: true
我将 SignalR 与官方文档建立了连接,并且只是使用“http://AICsystemApp/nodeRedHub”而不是“NavigationManager.ToAbsoluteUri("/chathub")”,根据这个线程:
我对 https:// 中的 docker 运行s 容器感到困惑,但如果我使用“https:///AICsystemApp/nodeRedHub”,我会收到错误消息:“远程证书无效根据验证程序。"
编辑* 看看我是否使用“https://AICsystemApp:44324/nodeRedHub”我没有错误使用 https,但同样的“连接被拒绝”错误。无处可去,但很有趣。
如果您需要更多信息,我随时准备回复! :)
提前致谢。
也尝试了 ipaddress:port/nodeRedHub,同样的结果。
我今天遇到了同样的错误,并且能够使用以下配置让它工作:
- 你必须使用 https,只有服务名称 (https://AICsystemApp/nodeRedHub)
- 您必须配置 kestrel 以使用 https://www.yogihosting.com/docker-compose-aspnet-core/
中所示的证书
基本上生成受信任的 dev-cert 证书并将其挂载到容器中,并使用以下附加环境变量:
- ASPNETCORE_HTTPS_PORT=9000
- ASPNETCORE_Kestrel__Certificates__Default__Password=<password>
- ASPNETCORE_Kestrel__Certificates__Default__Path=<mountedpath>/aspnetapp.pfx
- 由于您仍然有一个无效的证书,您应该忽略开发中的证书验证。在生产中仅使用有效证书。 SignalR 不使用通常的
ServicePointManager.ServerCertificateValidationCallback
但您必须在构建 SignalR 连接时配置它(我在这里找到:https://github.com/dotnet/aspnetcore/issues/16919):
Connection = new HubConnectionBuilder()
.WithUrl("https://host.docker.internal:...",conf =>
{
if (env.IsDevelopment())
{
conf.HttpMessageHandlerFactory = (x) => new HttpClientHandler
{
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
}
});
我没有测试你是否可以跳过第 2 步,因为无论如何我都需要它。您可以尝试忽略没有任何证书的所有内容,但无论如何您在生产中都需要它。
我遇到了这个问题,但为了解决它,我不需要做任何与 https 或证书有关的事情。我遇到的问题是 Kestrel 仍在侦听 Docker 容器内的默认网络接口,我需要重新配置它以侦听所有接口以使连接正常工作。
所以在 launchsettings.json
中,我需要将 applicationUrl
从 "https://localhost:5003;http://localhost:5002"
更改为 "https://0.0.0.0:5003;http://0.0.0.0:5002"
,然后一切正常。
我在 docker 上建立 SignalR 连接时遇到问题(IIS 运行良好)。
主要目标是 运行 docker 编写数据并将其从 nodeRed 容器发送到 webApp(.net core 3.1 Blazor),反之亦然。我建立了 docker 网络并成功地将两个容器放在那里。
问题是我的 SignalR 连接失败并显示“连接被拒绝”。我看这会有些陈词滥调,但找不到。
page.razor
protected override async Task OnInitializedAsync()
{
hubConnection = new HubConnectionBuilder()
.WithUrl("http://AICsystemApp/nodeRedHub")
.Build();
hubConnection.On<string, string>("ReceiveCommand", (user, message) =>
{
var encodedMsg = $"{destination}: {message}";
nodeRedOutput.Add(encodedMsg);
StateHasChanged();
});
await hubConnection.StartAsync();
}
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80 /* tried 8024 */
EXPOSE 443 /* tried 44324 */
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["AICsystemApp/AICsystemApp.csproj", "AICsystemApp/"]
RUN dotnet restore "AICsystemApp/AICsystemApp.csproj"
COPY . .
WORKDIR "/src/AICsystemApp"
RUN dotnet build "AICsystemApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "AICsystemApp.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "AICsystemApp.dll"]
docker-compose.override.yml
version: '3.4'
services:
aicsystemapp:
container_name: AICsystemApp
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
ports:
- "8024:80"
- "44324:443"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
networks:
- my-network
networks:
my-network:
external: true
我将 SignalR 与官方文档建立了连接,并且只是使用“http://AICsystemApp/nodeRedHub”而不是“NavigationManager.ToAbsoluteUri("/chathub")”,根据这个线程:
我对 https:// 中的 docker 运行s 容器感到困惑,但如果我使用“https:///AICsystemApp/nodeRedHub”,我会收到错误消息:“远程证书无效根据验证程序。"
编辑* 看看我是否使用“https://AICsystemApp:44324/nodeRedHub”我没有错误使用 https,但同样的“连接被拒绝”错误。无处可去,但很有趣。
如果您需要更多信息,我随时准备回复! :) 提前致谢。
也尝试了 ipaddress:port/nodeRedHub,同样的结果。
我今天遇到了同样的错误,并且能够使用以下配置让它工作:
- 你必须使用 https,只有服务名称 (https://AICsystemApp/nodeRedHub)
- 您必须配置 kestrel 以使用 https://www.yogihosting.com/docker-compose-aspnet-core/ 中所示的证书
基本上生成受信任的 dev-cert 证书并将其挂载到容器中,并使用以下附加环境变量:
- ASPNETCORE_HTTPS_PORT=9000
- ASPNETCORE_Kestrel__Certificates__Default__Password=<password>
- ASPNETCORE_Kestrel__Certificates__Default__Path=<mountedpath>/aspnetapp.pfx
- 由于您仍然有一个无效的证书,您应该忽略开发中的证书验证。在生产中仅使用有效证书。 SignalR 不使用通常的
ServicePointManager.ServerCertificateValidationCallback
但您必须在构建 SignalR 连接时配置它(我在这里找到:https://github.com/dotnet/aspnetcore/issues/16919):
Connection = new HubConnectionBuilder()
.WithUrl("https://host.docker.internal:...",conf =>
{
if (env.IsDevelopment())
{
conf.HttpMessageHandlerFactory = (x) => new HttpClientHandler
{
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
}
});
我没有测试你是否可以跳过第 2 步,因为无论如何我都需要它。您可以尝试忽略没有任何证书的所有内容,但无论如何您在生产中都需要它。
我遇到了这个问题,但为了解决它,我不需要做任何与 https 或证书有关的事情。我遇到的问题是 Kestrel 仍在侦听 Docker 容器内的默认网络接口,我需要重新配置它以侦听所有接口以使连接正常工作。
所以在 launchsettings.json
中,我需要将 applicationUrl
从 "https://localhost:5003;http://localhost:5002"
更改为 "https://0.0.0.0:5003;http://0.0.0.0:5002"
,然后一切正常。