docker - 如何在 Docker 镜像中运行 Signalr Blazor 客户端的 StartAsync 连接?

标签 docker asp.net-core signalr blazor

我创建了默认的 blazor 服务器端应用程序。然后添加Microsoft.AspNetCore.SignalR.ClientChatHub类(class)。然后编辑 startup.cs 文件(添加 services.AddSignalR()endpoints.MapHub<ChatHub>("/chatHub") )和 index.razor页。然后由 IIS express 运行。没关系。

然后添加了 docker 支持并运行 Docker 主机。它不工作。因为只有集线器连接的 StartAsync 方法不起作用。如何运行它?帮我?
非常感谢你们。

错误是:

An unhandled exception occurred while processing the request. SocketException: Cannot assign requested address System.Net.Http.ConnectHelper.ConnectAsync(string host, int port, CancellationToken cancellationToken)

HttpRequestException: Cannot assign requested address System.Net.Http.ConnectHelper.ConnectAsync(string host, int port, CancellationToken cancellationToken)



index.razor 代码:
@code {
    private HubConnection _hubConnection;

    protected override async Task OnInitializedAsync()
    {
        _hubConnection = new HubConnectionBuilder()
            .WithUrl(NavigationManager.ToAbsoluteUri("/chatHub"))
            .Build();

        _hubConnection.On<string, string>("ReceiveMessage", (user, message) =>
        {
            var encodedMsg = $"{user}: {message}";
            StateHasChanged();
        });

        await _hubConnection.StartAsync(); // **DON'T WORK IN DOCKER HOST.**
    }
}

docker 文件:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["BlazorApp1/BlazorApp1.csproj", "BlazorApp1/"]
RUN dotnet restore "BlazorApp1/BlazorApp1.csproj"
COPY . .
WORKDIR "/src/BlazorApp1"
RUN dotnet build "BlazorApp1.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "BlazorApp1.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "BlazorApp1.dll"]

最佳答案

我最好的猜测是您的集线器客户端正在尝试连接到“the-public-url-out-of-docker/chatHub”:

    _hubConnection = new HubConnectionBuilder()
        .WithUrl(NavigationManager.ToAbsoluteUri("/chatHub"))
        .Build();

NavigationManager.ToAbsoluteUri(...)将转换 /chatHub到向最终用户公开的公共(public) url。例如,如果您使用反向代理,它可能是域名。

请注意,网址分为三个不同的级别:
  • 公开的域名
  • 主机 IP 和端口
  • 容器 ip 和端口
  •   +----------------------------------+
      | HOST  (5000)                     |
      |   +                              |
      |   |Port Mapping---------------+  |
      |   >-->-->|Container (80)      |  |
      |          |                    |  |
      |          +--------------------+  |
      +-----^----------------------------+
            |  reverse proxy
    +-------+----------------------------+
    | nginx                              |
    |  https://www.myexample.com/chatHub
    |                                    |
    +-------^----------------------------+
            |
            |
            |
            |
    +-------+-----------+
    |                   |
    |   Browser         | (Brazor sees only the public url via NavgiationManager  )
    |                   |
    +-------------------+
    

    但是,在 docker 中运行时,主机的网络始终无法从容器的网络中访问。

    如果是这种情况,有几种方法应该可行:
  • 避免使用公共(public)网址,如 .WithUrl(NavigationManager.ToAbsoluteUri("/chatHub")) .将其硬编码到容器 ip&port。例如,如果你的容器在 80 上监听,它应该是 http://localhost/chatHub .
  • 为 docker 配置网络,或添加 --network用于运行 docker 时。更多详情,请参阅 this thread
  • 关于docker - 如何在 Docker 镜像中运行 Signalr Blazor 客户端的 StartAsync 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60408442/

    相关文章:

    operating-system - 我可以运行与其他操作系统链接的Docker容器吗

    docker - 如何在默认 Dockerfile 上重新加载 haproxy.cfg?

    c# - SignInAsync 与 AuthenticateAsync

    c# - 无法将模型值分配给 Razor 页面中的参数

    c# - 如何在azure web应用程序上部署信号R自托管服务器

    c# - Autofac 无法在运行时解析来自某些程序集的类型,在调试器中工作

    python - Docker 开发环境中的丰富编辑器

    debugging - Visual Studio Code 未在 OS X 上加载符号

    asp.net-core - kestrel 中自托管的信号器中的最大并发请求数

    Spring Boot、Docker 和 EC2 中的 Java 版本