Do tnet core 2.2 libgdipplus исключение - PullRequest
1 голос
/ 03 марта 2020

Я использую web-интерфейс do tnet core 2.2 на openshift, у меня есть метод api, который возвращает FileResult. Файл генерируется с помощью 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"] 

1 Ответ

0 голосов
/ 06 мая 2020

Я испытываю нечто подобное при использовании System.Drawing из библиотеки, которая генерирует QR-коды.

Кажется, проблема в том, что изображения Do tNet Core docker, sdk или runtime, не ' Т libgdiplus. Это не проблема для Linux, так как вы можете сделать что-то вроде apt-get install -y libgdiplus в своем контейнере или создать docker образ приложения с помощью образа времени выполнения DotNetCore плюс этот libgdiplus.

Это раздражает проблема. Я не уверен, что есть какое-либо решение, которое не требует путаницы с официальными docker изображениями, но пока что не повезло.

В настоящий момент я вижу несколько вариантов решения.

ВАРИАНТ A: Если вы используете docker образы DotNetCore для linux, как кажется, используйте apt для установки отсутствующих зависимостей времени выполнения, таких как libgdiplus, поскольку они не являются частью docker image.

ОПЦИЯ B: Найти хорошее docker изображение DotNetCore (sdk или runtime) со всеми этими зависимостями на месте

OPTION C : Найдите другую библиотеку, отличную от epplus, которая не зависит от System.Drawing libgdiplus. Но я даже не знаю, возможно ли это


ОБНОВЛЕНИЕ 1 Для варианта B вы можете попробовать следующее изображение docker, которое содержит pnet время выполнения ядра + необходимые вам зависимости: lonwern/aspnetcore-libgdiplus:2.1

Для получения дополнительной информации о том, как сгенерировать ваше изображение, если вы выберете вариант A, посмотрите, как это было создано здесь: https://hub.docker.com/r/lonwern/aspnetcore-libgdiplus/dockerfile

...