繁体   English   中英

Dotnet 核心 2.2 libgdipplus 异常

[英]Dotnet core 2.2 libgdipplus exception

我在 openshift 上运行 dotnet core 2.2 web api,我有一个返回 FileResult 的 api 方法。 该文件是使用 epplus 生成的。 但是,在容器化应用程序后,端点返回以下错误。 我相信如果使用 system.drawing 库会发生此异常,但是我没有使用任何 system.drawing 功能。

System.TypeInitializationException:“Gdip”的类型初始值设定项引发异常。 ---> System.DllNotFoundException: 无法加载 DLL 'libgdiplus': 找不到指定的模块。

public async Task<FileResult> GetPSACostCaseAndFeedData([FromQuery] int caseId, [FromQuery] int proposalId, [FromQuery] int equipmentId)
        {
            try
            {
                var queryParams = new Dictionary<string, string> { { "caseId", caseId.ToString() }, { "proposalId", proposalId.ToString() }, { "equipmentId", equipmentId.ToString() } };
                var restObj = _restFactory.createRestRequest(Method.GET, "ProposalService/PSACostData/GetPSACostCaseAndFeedData", queryParams);
                Console.WriteLine("Base URL - "  + restObj.Item2.BaseUrl);
                var response = await restObj.Item2.ExecuteTaskAsync(restObj.Item1);
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    var result = JsonConvert.DeserializeObject<PSACostCaseDetailsResponse>(response.Content);
                    Console.WriteLine("result -" + response.Content.ToString());
                    Console.WriteLine("start writing file");
                    var excelPackage = await _iPSACostExcelHelper.PopulatePsaCostFile(result, Path.Combine(_hostingEnvironment.ContentRootPath, "App_data", "PSACOST_V9.2.2.xlsm"));
                    Console.WriteLine("finished writing file");
                    return await Task.FromResult(File(_excelHelper.ConvertWorkBookToByteArray(excelPackage), ContentTypeEnums.excel, result.customerInformationModel.ProposalNum + "_" + result.caseDataModel.CaseNm + ".xlsm"));
                }
                throw new Exception("There is no PSA cost data for this case");
            }

“完成写入文件”行确实打印到标准输出,之后的行失败。 有人可以帮助我了解这里出了什么问题吗? 为什么返回 FileResult 类型的方法需要 system.drawing?

下面也是我的dockerfile。

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2.7-alpine3.10
LABEL pipelineName="PSACOST.API" \
      pipelineKey="UMAOKJOH" \
      offeringKey="KKWEECBH"
RUN apk upgrade -U
EXPOSE 5000
ENV ASPNETCORE_URLS=http://*:5000
WORKDIR /app
COPY . /app
USER guest
ENTRYPOINT ["dotnet", "PSACOST.API.Web.dll"] 

从生成二维码的库中使用System.Drawing时,我遇到了类似的问题。

问题似乎是 DotNet Core docker 图像、sdk 或运行时没有libgdiplus 这对 Linux 来说不是问题,因为您可以在容器中执行诸如apt-get install -y libgdiplus ,或者使用 DotNetCore 运行时映像和libgdiplus构建应用程序 docker 映像。

这是一个烦人的问题。 我不确定是否有任何解决方案不需要弄乱官方 docker 图像,但到目前为止还没有运气。

目前我可以看到一些解决方案选项。

选项 A:如果您在 linux 上使用 docker DotNetCore 映像,看起来,请使用 apt 安装缺少的运行时依赖项,例如libgdiplus因为它们不是 docker 映像的一部分。

选项 B:找到一个好的 docker DotNetCore 映像(sdk 或运行时),其中包含所有这些依赖项

选项 C:查找不依赖System.Drawinglibgdiplus epplus以外的其他库。 但我什至不知道这是否可能


更新1对于选项B,您可以尝试使用以下包含aspnet核心运行时+您需要的依赖项的lonwern/aspnetcore-libgdiplus:2.1lonwern/aspnetcore-libgdiplus:2.1

如果您选择了选项 A,有关如何生成图像的更多信息,请参阅此处的创建方式: https : //hub.docker.com/r/lonwern/aspnetcore-libgdiplus/dockerfile


更新 2我创建了包含 DotNet Core SDK 和 AspNet Core 以及libgdiplus公共 Docker 映像,以便在运行使用System.Drawing应用程序时可以使用它们,或者使用 SDK DotNet Core CLI(例如:dotnet vstest、dotnet test等)或运行时。

https://hub.docker.com/repository/docker/sunnyatticsoftware/dotnet-core-sdk-libgdiplus

https://hub.docker.com/repository/docker/sunnyatticsoftware/dotnet-core-aspnet-libgdiplus

有关回购本身的更多信息。

我在 CI/CD 管道和 Web 应用程序的最终 Docker 映像中使用它们,以避免这些运行时异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM