У меня есть служба WCF. Далее у меня есть проект .NET CORE веб-API. Веб-API вызывает службу WCF. В локалке все работает нормально. Потом ставлю Веб-API в докер-контейнере, Web API работает, но это не могу общаться с сервисом WCF.
В прошлых версиях все нормально работало с докером. Я проверил, у контейнера docker есть доступ к сети (ping, wget...).
Версия для кокера:
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:31 2019
OS/Arch: windows/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
Ошибка от API:
An unhandled exception was thrown by the application.
System.ServiceModel.CommunicationException: Cannot assign requested address
---> System.Net.Http.HttpRequestException: Cannot assign requested address
---> System.Net.Sockets.SocketException: Cannot assign requested address
at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
at System.Threading.Tasks.ValueTask`1.get_Result()
at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Threading.Tasks.ValueTask`1.get_Result()
at System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask`1 creationTask)
at System.Threading.Tasks.ValueTask`1.get_Result()
at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.DecompressionHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.ServiceModel.Channels.ServiceModelHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
at System.ServiceModel.Channels.HttpChannelFactory`1.HttpClientRequestChannel.HttpClientChannelAsyncRequest.SendRequestAsync(Message message, TimeoutHelper timeoutHelper)
--- End of inner exception stack trace ---
at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
at System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.<>c__DisplayClass1_0.<CreateGenericTask>b__0(IAsyncResult asyncResult)
А вот мой файл докера — этот же файл работал раньше:
FROM microsoft/dotnet:2.1-aspnetcore-runtime-stretch-slim AS base
WORKDIR /app
EXPOSE 80
COPY ["BlackFoxWebAPI/KerasEvaluator.zip", "/app/"]
FROM microsoft/dotnet:2.1-sdk-stretch AS build
WORKDIR /src
COPY ["BlackFoxWebAPI/BlackFoxWebAPI.csproj", "BlackFoxWebAPI/"]
COPY ["BlackFoxWebAPIModels/BlackFoxWebAPIModels.csproj", "BlackFoxWebAPIModels/"]
COPY ["KerasAPIClient/KerasAPIClient.csproj", "KerasAPIClient/"]
RUN dotnet restore "BlackFoxWebAPI/BlackFoxWebAPI.csproj"
COPY . .
WORKDIR "/src/BlackFoxWebAPI"
RUN dotnet build "BlackFoxWebAPI.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "BlackFoxWebAPI.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "BlackFoxWebAPI.dll"]
@TaoZhou 1. Служба wcf размещена на удаленной машине, а не в докере. 2. Если запросить метод, который не вызывает службу wcf, он работает. 3. Ошибка от API: - это журнал из контейнера.
Поделитесь с нами кодом для запроса службы wcf, реализуете ли вы какую-либо безопасность для службы wcf?





РЕШЕНО
Проблема заключалась в настройке ссылки на службу в Visual Studio. После изменения адреса WCF в ConnectedService.json вам необходимо обновить поставщика Microsoft WCF для каждой среды. Я не обновлял env версии docker, и в версии использовалась какая-то старая ссылка — ссылка НЕТ из ConnectedService.json.
Где вы разместили службу wcf? Если вы запросите метод, который не вызывает службу wcf, будет ли он работать? Попробуйте запустить
docker logs containernameи поделитесь с нами результатом.