Мой 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);
}


Вы не соответствуете 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/"
@SudarshanGaikwad Когда вы получили эту ошибку? Если вы обращаетесь к веб-API напрямую из веб-браузера с портом 5000, будет ли он доступен?
Zhos, он доступен из веб-браузера с портом 5000, но не работает, когда «e2e-test-container» попадает в «pagingsystem-messagequeue-container». Как я сказал в комментарии выше, когда я использую URI «pagingsystem-messagequeue-контейнер: 80» в appsettings.json, он выдает ошибку «System.Net.Http.HttpRequestException: ресурс временно недоступен»
@SudarshanGaikwad Поделитесь кодом, связанным с отправкой запроса из тестового проекта e2e.
@ Tao Zhou, я добавил "BaseTest.cs". Файл проекта end2end, из которого происходит обращение к API. Если этого файла будет мало, добавлю на github демонстрационный проект.
@SudarshanGaikwad Я бы посоветовал поделиться с нами демо
@SudarshanGaikwad: вы решили эту проблему, я тоже с этим сталкиваюсь?
Спасибо, Тао Чжоу! Я пробовал использовать URI «pagingsystem-messagequeue-контейнер: 80», теперь я получаю ошибку «System.Net.Http.HttpRequestException: ресурс временно недоступен».