如何在扩展底座镜像中运行SignalR Blazor客户端的StartAsync连接? [英] how to run StartAsync connection of signalr blazor client in docker image?

查看:25
本文介绍了如何在扩展底座镜像中运行SignalR Blazor客户端的StartAsync连接?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

然后添加了坞站支持并运行Docker主机。这不管用。因为只有集线器连接StartAsync方法不起作用。怎么经营呢?帮我? 非常感谢各位。

错误为:

处理请求时发生未经处理的异常。 SocketException:无法分配请求的地址 System.Net.Http.ConnectHelper.ConnectAsync(string主机、内部端口、取消令牌)

HttpRequestException:无法分配请求的地址 System.Net.Http.ConnectHelper.ConnectAsync(string主机、内部端口、取消令牌)

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/chat Hub":

    _hubConnection = new HubConnectionBuilder()
        .WithUrl(NavigationManager.ToAbsoluteUri("/chatHub"))
        .Build();
NavigationManager.ToAbsoluteUri(...)会将/chatHub转换为向最终用户公开的公共URL。例如,如果您使用的是反向代理,则可能是域名。

注意:有三个不同级别的URL:

  • 对外公开的域名
  • 主机IP端口(&A)
  • 容器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中运行时,无法始终从容器的网络访问主机的网络。

如果是这种情况,有几种方法应该有效:

  1. 避免使用.WithUrl(NavigationManager.ToAbsoluteUri("/chatHub"))这样的公共url。将其硬编码到容器IP&;端口。例如,如果您的容器监听80,则应该是http://localhost/chatHub
  2. 为docker配置网络,或在运行docker时为添加--network。详情请参见this thread

这篇关于如何在扩展底座镜像中运行SignalR Blazor客户端的StartAsync连接?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆