在 .NET Core Docker Linux 容器中使用 SOAP Web 服务

问题描述

我有以下结构

  • .NET Core 5.0 Web API
  • Docker 容器 Linux

Web API 位于 Docker Linux 容器中。

我正在尝试从 Dynamics NAV 2017 中的 SOAP Web 服务 获取数据,但是我在 Linux 容器中使用 NTLM 身份验证时遇到了困难。

我需要连接到 Web 服务 (CatalogItem) 并从方法 ReadMultiple() 获取数据,如下图所示:

enter image description here

此 Web API 将托管在 Linux 服务器上,因此需要在 Docker Linux 容器上运行。

我使用 .NET Core 提供的添加服务引用工具创建了到 Web 服务的连接,该工具生成一个包含 Reference.cs文件夹ConnectedService.json 文件

当我运行应用程序并在 Swagger UI 中打开它时,出现以下错误

System.PlatformNotSupportedException: NTLM authentication is not possible with default credentials on this platform.
   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)
--- End of stack trace from prevIoUs location ---
   at ServiceDBTest.Controllers.WeatherForecastController.CatalogItem() in /src/ServiceDBTest/Controllers/WeatherForecastController.cs:line 34
   at lambda_method5(Closure,Object )
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper mapper,ObjectMethodExecutor executor,Object controller,Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker,ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterasync>g__Awaited|10_0(ControllerActionInvoker invoker,Task lastTask,State next,Scope scope,Object state,Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next,Scope& scope,Object& state,Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterasync>g__Awaited|13_0(ControllerActionInvoker invoker,Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker,Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker,Task task,Idisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint,Task requestTask,ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext,ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

我一直在搜索什么,我需要在我的 Docker 容器中使用 Kerberos 客户端或安装 CNTLM,但我不确定。我需要做什么才能实现这一点?

这是 docker-compose 文件

version: "3.5"
services:
    servicedb:
        container_name: servicedb
        build:
            context: ./ServiceDBTest/ServiceDBTest
            dockerfile: Dockerfile
            args:
                - ASPNETCORE_ENVIRONMENT_ARG=development
        ports:
            - 5000:80
        volumes:
            - "./ServiceDBTest/ServiceDBTest:/ServiceDBTest"
        environment:
            - HOST=0.0.0.0

这是Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
ARG ASPNETCORE_ENVIRONMENT_ARG
ENV ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT_ARG}
workdir /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
workdir /src
copY ["./ServiceDBTest.csproj","ServiceDBTest/"]
RUN dotnet restore "ServiceDBTest/ServiceDBTest.csproj"
copY . .
workdir "/src/ServiceDBTest"
copY . .
RUN dotnet build "ServiceDBTest.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "ServiceDBTest.csproj" -c Release -o /app/publish

FROM base AS final
workdir /app
copY --from=publish /app/publish .
ENTRYPOINT ["dotnet","ServiceDBTest.dll"]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)