Как запустить StartAsyn c подключение клиента сигнализатора Blazor в docker образе? - PullRequest
0 голосов
/ 26 февраля 2020

Я создал приложение по умолчанию для сервера Blazor. Затем добавлены Microsoft.AspNetCore.SignalR.Client и ChatHub класс. Затем отредактировал файл startup.cs (добавьте services.AddSignalR() и endpoints.MapHub<ChatHub>("/chatHub")) и страницу index.razor. Затем запустите IIS express. это хорошо.

Затем добавили поддержку docker и запустили Docker host. это не работает. Потому что не работает только хаб-соединение StartAsyn c методом. Как запустить это? Помоги мне? Большое спасибо, ребята.

Ошибка:

Произошло необработанное исключение при обработке запроса. SocketException: Невозможно назначить запрошенный адрес System. Net .Http.ConnectHelper.ConnectAsyn c (строка host, int port, CancellationToken cancellationToken)

HttpRequestException: Невозможно назначить запрошенный адрес System. Net .Http. ConnectHelper.ConnectAsyn c (строка 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"]

1 Ответ

1 голос
/ 26 февраля 2020

Мне кажется, ваш хаб-клиент пытается подключиться к "the-publi c -url-out-of-docker / chatHub":

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

NavigationManager.ToAbsoluteUri(...) преобразует /chatHub в публичный c URL, который предоставляется конечному пользователю. Например, если вы используете обратный прокси, это может быть имя домена.

Обратите внимание, что URL-адрес находится на трех разных уровнях:

  • имя домена, доступного для publi c
  • 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 сеть хоста не всегда доступна из сети контейнера.

Если в этом случае есть несколько подходов, которые должны работать:

  1. Избегайте использования publi c url наподобие .WithUrl(NavigationManager.ToAbsoluteUri("/chatHub")). Жестко закодируйте его в контейнер ip & port. Например, если ваш контейнер прослушивает 80, это должно быть http://localhost/chatHub.
  2. Сконфигурировать сеть для docker или добавить --network для запуска docker. Подробнее см. в этой теме
...