Можно ли использовать EPPlus в основном приложении dotnet, работающем в окне докера Windows? - PullRequest
0 голосов
/ 23 января 2019

У меня есть веб-API 2.1 для dotnet core, действие которого генерирует электронную таблицу .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, в частности, изображение: microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-sac2016 При попытке создать отчет я получаю следующее исключение:

System.TypeInitializationException: инициализатор типа для 'Gdip' бросил исключение. ---> System.DllNotFoundException: невозможно загрузить DLL 'gdiplus.dll'

После небольшого исследования я понимаю, что gdiplus отсутствует в образе наносервера.

Можно ли использовать EPPlus для создания электронной таблицы в основном приложении dotnet, размещенном в образе наносервера? Или мне придется использовать другую библиотеку для генерации xlsx? Я хотел бы использовать EPPlus, если это возможно. Я не могу использовать контейнер Linux (пока, к сожалению, пока)

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Вы можете создать свой собственный образ 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 в окне командной строки second и зафиксируйте образ:

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 и библиотеками, которые вы используете.необходимо прекратить ошибки.

Вероятно, изображение можно было немного обрезать, но это была моя первая успешная попытка решить эту проблему, когда другие методы, которые я обнаружил в сети, не увенчались успехом из-за ограничений корпоративного брандмауэра.и тому подобное.

0 голосов
/ 20 марта 2019

Я не знаю, будет ли это работать, но попробуйте закомментировать любой из методов из библиотеки, которая использует System.Drawing.Common, например, AutoFitColumns().Это то, что заставило его сломаться на моем контейнере Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...