【问题标题】:Is it possible to use EPPlus in dotnet core app running in a windows docker container?是否可以在 Windows Docker 容器中运行的 dotnet 核心应用程序中使用 EPPlus?
【发布时间】:2019-06-17 04:28:19
【问题描述】:

我有一个 dotnet core 2.1 web api,它有一个生成 .xlsx 电子表格的操作。它创建了一个 FileStreamResult ,然后浏览器可以处理。生成电子表格的代码如下:

using (var excelFile = new ExcelPackage())
using (var worksheet = excelFile.Workbook.Worksheets.Add("Sheet 1"))
{
    ...
    //insert data into worksheet

    return new FileStreamResult(new MemoryStream(excelFile.GetAsByteArray()), "application/octet-stream") { FileDownloadName = "Report.xlsx" };
}

在 IIS 中托管它可以正常工作,并且会生成电子表格。 当我在 windows docker 容器中托管应用程序时,特别是图像:microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016 在尝试生成报告时出现以下异常:

System.TypeInitializationException: 'Gdip' 的类型初始化器 抛出异常。 ---> System.DllNotFoundException:无法加载 DLL 'gdiplus.dll'

经过一番研究,我意识到 gdiplus 不存在于 nanoserver 映像中。

是否可以使用 EPPlus 在托管在 nanoserver 映像中的 dotnet 核心应用程序上创建电子表格?还是我必须使用另一个库来生成 xlsx?如果可能的话,我想使用 EPPlus。我不能使用 linux 容器(不幸的是现在)

【问题讨论】:

  • 好问题。维卡斯会很自豪的。
  • 您是否考虑过在 Server Core 而不是 Nano Server 之上构建?
  • 我已经考虑过这一点,但目前这是一个相对较小的功能,在服务器核心上构建似乎有点过分。据我了解,从速度和安全性的角度来看,nano server 非常适合托管 dotnet core。如果我无法避免,那么我可能不得不走那条路。我希望还有另一种我错过的方式
  • 尝试改用Spire Xls。我发现这是一个很棒的工具。
  • 你能确认没有使用gdi plus吗?

标签: c# docker .net-core gdi+ epplus


【解决方案1】:

我不知道它是否会起作用,但请尝试注释掉库中使用System.Drawing.Common 的任何方法,例如AutoFitColumns()。这就是导致它在我的 linux 容器上崩溃的原因。

【讨论】:

  • 我会看看我能不能做到这一点,就其性质而言,这是一个短期的解决方案,因为将来我可能需要使用System.Drawing.Common,然后我会再次遇到这种情况。但是,它可能会在短期内提供补救措施。
  • 这确实对我有用,在我需要更多功能之前,这将正常工作。总是有在服务器核心上构建 docker 映像的备份。但很高兴我现在不必这样做!
【解决方案2】:

您可以构建自己的 ubtuntu/dotnetcore 映像!我只是为这个问题自己做的。

从命令行:

docker pull ubuntu

docker run -t -t ubuntu:latest /bin/bash -> to open a container shell ->

    apt-get update

    apt-get install wget    

    wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

    dpkg -i packages-microsoft-prod.deb

    apt-get install apt-transport-https

    apt-get update

    apt-get install dotnet-sdk-2.2

在此处安装我们需要解决 System.Drawing/EPPlus 问题的特殊库:

    apt-get install libgdiplus

    cd /usr/lib

    ln -s libgdiplus.so gdiplus.dll

    apt-get install libc6-dev libx11-dev

    rm -rf /var/lib/apt/lists/*

第二个命令行窗口中找到容器进程id并提交镜像:

docker ps 


    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
    4975113bb79        ubuntu:latest       "/bin/bash"         9 minutes ago       Up 9 minutes                            infallible_poincare

docker commit d497 custom/imagename:dotnetcore-2.2-custom

docker ps kill d497

docker image rm ubuntu

现在您有了一个自定义的 ubuntu 映像(与 dotnetcore 使用的映像相同),其中已加载了 sdk 以及您需要停止错误的库。

图像可能会被剪掉很多,请注意,这是我第一次成功尝试解决这个问题,由于公司防火墙限制等原因,我在网上找到的其他方法没有成功。

【讨论】:

  • 感谢您的回答,但我专门为 Windows 容器寻找解决方案。当我能够使用 linux 容器时,我一定会寻求您的解决方案!
猜你喜欢
  • 2020-11-21
  • 1970-01-01
  • 2020-07-16
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多