【问题标题】:SignalR can't connect using docker compose/containerSignalR 无法使用 docker compose/container 进行连接
【发布时间】:2021-09-25 12:12:02
【问题描述】:

我在 docker 上建立 SignalR 连接时遇到问题(IIS 运行良好)。

主要目标是运行 docker compose 并将数据从 nodeRed 容器发送到 webApp(.net core 3.1 Blazor),反之亦然。我制作了 docker network 并成功地将两个容器放在那里。

问题是我的 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")”:how to run StartAsync connection of signalr blazor client in docker image?

我很困惑 docker 在 https:// 中运行容器,但如果我使用“https://AICsystemApp/nodeRedHub”,我会收到错误消息:“根据验证程序,远程证书无效。”
编辑*找出我是否使用“https://AICsystemApp:44324/nodeRedHub”我没有错误的https,但同样的“连接被拒绝”错误。引人入胜。

如果您需要更多信息,我随时准备回复! :) 提前致谢。

也试过ipaddress:port/nodeRedHub,结果一样。

【问题讨论】:

  • 在您的 yml 文件中,端口 44324 指向 443,这是 ssl,所以这就是为什么当您放入端口时它可以工作。我也没有在您的文件中看到证书(自签名或域) .yml 文件。这可能就是您收到该证书错误的原因。您应该使用 nginx.conf 文件作为 ssl 代理。

标签: docker asp.net-core docker-compose blazor-server-side asp.net-core-signalr


【解决方案1】:

我今天遇到了同样的错误,并且能够使用以下配置使其正常工作:

  1. 您必须使用 https,仅使用服务名称 (https://AICsystemApp/nodeRedHub)
  2. 您必须配置 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
  1. 由于您仍然有一个无效的证书,您应该忽略开发中的证书验证。在生产中仅使用有效证书。 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 步,因为无论如何我都需要它。您可以尝试在没有任何证书的情况下忽略所有内容,但无论如何您在生产中都需要它。

【讨论】:

  • 谢谢!我花了一段时间来尝试它,还有其他事情要做,这必须是附带任务。 :D BTW -> 不需要第 2 步! :)
  • 感谢您的反馈,我会检查是否也可以省略步骤 2,这会大大简化解决方案:)
【解决方案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",然后一切正常。

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 2020-06-03
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多