Веб-интерфейс C#, развернутый в docker, не предоставляет доступ к порту локальной машине

#c# #docker #dockerfile

#c# #докер #докерфайл

Вопрос:

В настоящее время у меня есть приложение (.Net Core 3.1), которое прослушивает порт 40003. Теперь я пытаюсь поместить его в контейнер. Я создал файл dockerfile:

 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base WORKDIR /app EXPOSE 40003  FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build WORKDIR /src COPY ["myProject/myProject/myProject.csproj", "myProject/myProject/"]  RUN dotnet restore "myProject/myProject/myProject.csproj" --configfile ./NuGet.Config COPY . . WORKDIR "/src/myProject/myProject" RUN dotnet build "myProject.csproj" -c Release -o /app/build  FROM build AS publish RUN dotnet publish "myProject.csproj" -c Release -o /app/publish  FROM base AS final ENV ASPNETCORE_URLS=http://*:40003 ENV ASPNETCORE_ENVIRONMENT="development" EXPOSE 40003 WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "myProject.dll"]  

Как вы видите, я открыл порт 40003 и установил переменную ASPNETCORE_URLS. Я управляю этим:

 docker run -it --rm --name myTag -p 40003:40003 myTag  

Когда я вхожу в контейнер:

 docker exec -it myTag bash  

и выполнение:

 wget http://localhost:40003  

Я получил ожидаемый результат. Поэтому я верю, что мой компонент внутри контейнера жив и слушает Однако, когда я пытаюсь перейти к

 http://localhost:40003  

из моего локального браузера я получаю ERR_EMPTY_RESPONSE.

Можете ли вы дать несколько советов? Заранее спасибо.

Редактировать:===================

Я опубликовал полный файл docker. (добавлены первые 3 строки в файл docker, который определяет базу).

Да, я уверен, что я отправил сообщение на HTTP (не https).

http://localhost:40003 возвращает правильный ответ, который является пользовательским «selftest» При отсутствии разработки, если эта конечная точка заблокирована. Что-то вроде:

 [HttpGet]  [HttpPost]  public JsonResultlt;DiagnosticsResultgt; ServerStatus()  

Ответ: Я действительно не получил никакого ответа. Нет 200, 404 и т. Д. Просто ничего. Кроме того, сейчас я регистрирую этот результат самопроверки. Выше, когда я нахожусь в докере

 INFORMATION 2021-11-30 09:15:48,738 [Omdc.SelfHost.Base.Tests.MinimumDiskSpaceTest.Run] MinimumDiskSpaceTest starting. INFORMATION 2021-11-30 09:15:48,741 [Omdc.SelfHost.Base.Tests.MinimumDiskSpaceTest.Run] Drive: /, Volume label: /, Total available space: 82%  

Но когда я запрашиваю из локального браузера, нет ни журналов консоли, ни ответов HTTP. Поэтому моя просьба не достигать конечной точки (?)

Комментарии:

1. По-моему, это выглядит неплохо. Одна вещь, которую я заметил в вашем файле Dockerfile, заключается в том, что у вас есть FROM base AS final , но вы никогда не определяете, что такое базовое изображение. Вы опубликовали полный файл Dockerfile?

2. ASP.NET Основные проекты веб-API по умолчанию используют HTTPS и перенаправляют HTTP-запросы на конечную точку HTTPS. Вы должны явно отключить HTTPS. Вы уверены wget , что подключаетесь только к HTTP и не перенаправляетесь на HTTPS?

3. Используйте вкладку Сеть в инструментах разработчика браузера, чтобы узнать, что происходит и каков фактический ответ. ERR_EMPTY_RESPONSE это то, что отображает браузер, а не сам фактический ответ.

4. @PanagiotisKanavos Он выдает предупреждение и возвращается к использованию http, когда в ASPNETCORE_URLS не определена конечная точка https

5. Еще одна вещь: поскольку вы создали приложение webapi, кажется странным, что вы ожидаете ответа на localhost:40003 . Я бы подумал, что вы бы указали конечную точку API с именем контроллера. Т. Е. для приложения webapi шаблона URL-адрес будет localhost:40003/weatherforecast .