【问题标题】:Can't conncet to WCF service from .NET CORE Web API in Docker无法从 Docker 中的 .NET CORE Web API 连接到 WCF 服务
【发布时间】:2019-11-24 07:40:09
【问题描述】:

我有 WCF 服务。接下来,我有 .NET CORE WEB API 项目。 Web API 调用 WCF 服务。在本地 evrything 工作正常。然后我将 Web API 放入 docker 容器中,Web API 可以工作,但它无法与 WCF 服务通信

在过去的版本中,所有东西都可以正常使用 docker。我检查了,docker 容器可以访问互联网(ping、wget...)。

Dcoker 版本:

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)

这是我的 docker 文件 - 之前使用的文件相同:

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"]

【问题讨论】:

  • 您在哪里托管 wcf 服务?如果您请求一个不调用 wcf 服务的方法,它会起作用吗?尝试运行docker logs containername 并与我们分享结果。
  • @TaoZhou 1. wcf 服务托管在远程机器上 - 而不是在 docker 中。 2. 如果请求一个不调用 wcf 服务的方法,它可以工作 3. API 错误: 是来自容器的日志
  • 把请求wcf服务的代码分享给我们,你们为wcf服务实现了安全吗?

标签: c# docker wcf asp.net-core-2.0 asp.net-core-webapi


【解决方案1】:

已解决

问题在于在 Visual Studio 中设置服务引用。在ConnectedService.json 中更改 WCF 地址后,您必须为每个环境更新 Microsoft WCF 提供程序。我没有更新 docker relese env,relese 使用了一些旧参考 - NOT 来自ConnectedService.json 的参考。

【讨论】:

    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 2022-01-20
    • 2019-06-05
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多