System.Net.Http.HttpRequestException: в соединении отказано

Мой API и EndToEndTests находятся в двух разных контейнерах, когда я создаю docker-compose.yml, я получаю исключение при отказе в соединении.

Не удалось

PagingSystem.MessageQueue.EndToEndTests.Test.ValueControllerTest.Get_AllValues_ReturnsTrue

| Error Message:
|  System.Net.Http.HttpRequestException : Connection refused
| ---- System.Net.Sockets.SocketException : Connection refused
| Stack Trace:
|    at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
|    at System.Threading.Tasks.ValueTask1.get_Result()
|    at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
|    at System.Threading.Tasks.ValueTask1.get_Result()
              

Ниже приведены мои файлы docker (API и End2End), docker-compose.yml и appsetting.json:

Докер API

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY Source/PagingSystem.MessageQueue/PagingSystem.MessageQueue.csproj Source/PagingSystem.MessageQueue/
RUN dotnet restore Source/PagingSystem.MessageQueue/PagingSystem.MessageQueue.csproj
COPY . .
WORKDIR /src/Source/PagingSystem.MessageQueue
RUN dotnet build PagingSystem.MessageQueue.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish PagingSystem.MessageQueue.csproj -c Release -o /app

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

Окно настройки End2End Test

FROM microsoft/dotnet:2.1.301-sdk AS build
EXPOSE 80
EXPOSE 443

WORKDIR /src

# copying
COPY Source/PagingSystem.MessageQueue/PagingSystem.MessageQueue.csproj Source/PagingSystem.MessageQueue/
COPY Tests/PagingSystem.MessageQueue.EndToEndTests/PagingSystem.MessageQueue.EndToEndTests.csproj Tests/PagingSystem.MessageQueue.EndToEndTests/
COPY Tests/PagingSystem.MessageQueue.UnitTests/PagingSystem.MessageQueue.UnitTests.csproj Tests/PagingSystem.MessageQueue.UnitTests/

#restore 
RUN dotnet restore Source/PagingSystem.MessageQueue/PagingSystem.MessageQueue.csproj
RUN dotnet restore Tests/PagingSystem.MessageQueue.EndToEndTests/PagingSystem.MessageQueue.EndToEndTests.csproj
RUN dotnet restore Tests/PagingSystem.MessageQueue.UnitTests/PagingSystem.MessageQueue.UnitTests.csproj

#copy rest
COPY . .

#build
WORKDIR /src/Tests/PagingSystem.MessageQueue.EndToEndTests
RUN dotnet build -c Release -o /app
CMD ["sh", "-c", "sleep 1m && dotnet test -c Release -o /app"]
    

docker-compose.yml

version: '3.4'
services:
  pagingsystem.messagequeue:
    container_name: pagingsystem-messagequeue-container
    image: pagingsystemmessagequeue
    build:
      context: .
      dockerfile: Source/PagingSystem.MessageQueue/Dockerfile
    ports:
      - 5000:80
      - 5002:443
    networks: 
       - xyz-network

 pagingsystem.messagequeue.endtoendtest:
    container_name: e2e-test-container
    image: pagingsystem.messagequeueendtoendtest
    ports:
      - 5011:80
      - 5003:443
    build:
      context: .
      dockerfile: Tests/PagingSystem.MessageQueue.EndToEndTests/Dockerfile
    networks:  
      - xyz-network

networks:
  xyz-network:
    driver: "bridge"

appsetting.json

 {
      "MessageQueueApi": {
        "Url": "http://pagingsystem-messagequeue-container:5000/"
 }

BaseTest.cs:

public class BaseTest : IDisposable
    {
        public BaseTest()
        {
            var appSettings = AppSettings.Current;
            var httpClientHandler = new HttpClientHandler()
            {
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
            };
            this.HttpClient = new HttpClient(httpClientHandler)
            {
                BaseAddress = appSettings.MessageQueueApi.Url,

            };
            Console.WriteLine("<---API URL is --->" + appSettings.MessageQueueApi.Url);

            Console.WriteLine("---Base address");
            Console.WriteLine(this.HttpClient.BaseAddress);
        }

        public HttpClient HttpClient { get; set; }

        public List<string> AllValues { get; set; }

        public void Dispose() => this.HttpClient.Dispose();

        protected async Task GetAllValues()
        {
            Console.WriteLine("----in get all values---");
            var response  = await this.HttpClient.GetAsync("api/values");
            response.StatusCode.ShouldBe(HttpStatusCode.OK);         
        }

    protected Task<HttpResponseMessage> ClearCache() =>
        this.HttpClient.PostAsJsonAsync("cache/clear", string.Empty);
}
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
4
0
15 556
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не соответствуете HOST_PORT и CONTAINER_PORT.

Для 5000:80, 5000 - это HOST_PORT, а 80 - это CONTAINER_PORT. При доступе к контейнеру из контейнера в сетевой связи между сервисами используется CONTAINER_PORT.

Попробуй сменить "Url": "http://pagingsystem-messagequeue-container:5000/" на "Url": "http://pagingsystem-messagequeue-container:80/"

Спасибо, Тао Чжоу! Я пробовал использовать URI «pagingsystem-messagequeue-контейнер: 80», теперь я получаю ошибку «System.Net.Http.HttpRequestException: ресурс временно недоступен».

Sudarshan Gaikwad 11.12.2018 08:45

@SudarshanGaikwad Когда вы получили эту ошибку? Если вы обращаетесь к веб-API напрямую из веб-браузера с портом 5000, будет ли он доступен?

Edward 11.12.2018 08:47

Zhos, он доступен из веб-браузера с портом 5000, но не работает, когда «e2e-test-container» попадает в «pagingsystem-messagequeue-container». Как я сказал в комментарии выше, когда я использую URI «pagingsystem-messagequeue-контейнер: 80» в appsettings.json, он выдает ошибку «System.Net.Http.HttpRequestException: ресурс временно недоступен»

Sudarshan Gaikwad 11.12.2018 09:03

@SudarshanGaikwad Поделитесь кодом, связанным с отправкой запроса из тестового проекта e2e.

Edward 11.12.2018 09:24

@ Tao Zhou, я добавил "BaseTest.cs". Файл проекта end2end, из которого происходит обращение к API. Если этого файла будет мало, добавлю на github демонстрационный проект.

Sudarshan Gaikwad 11.12.2018 10:09

@SudarshanGaikwad Я бы посоветовал поделиться с нами демо

Edward 11.12.2018 10:16

@SudarshanGaikwad: вы решили эту проблему, я тоже с этим сталкиваюсь?

Dheeraj Kumar 26.07.2020 10:29

Другие вопросы по теме