System.drawing.common 'gdip' の型初期化子が例外をスローしました 質問する

System.drawing.common 'gdip' の型初期化子が例外をスローしました 質問する

これは、ワークシートに画像を追加するためのコードです。データベースから画像をバイトとして取得します。.Net Core フレームワークのバージョンは 2.2.104 です。これは API プロジェクトです。私のロケールでは、コードは正常に動作します。以下のように、ClosedXML コンポーネント 0.95.4 バージョンを使用します。

[HttpPost("GetTowel")]
public IActionResult GetTowel()
{
    string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    string fileName = "Towel Quotation.xlsx";
    try
    {
        using (var workbook = new XLWorkbook())
        {
            IXLWorksheet worksheet = workbook.Worksheets.Add("Towel Quotation");
            
            byte[] bytes = _fileService.Get(159).FileInBytes;
            System.IO.Stream x = new System.IO.MemoryStream(bytes);

            //the exception is throwed at this line:
            **var image = worksheet.AddPicture(x).MoveTo(worksheet.Cell("P1")).Scale(1.0);**

            using (var stream = new MemoryStream())
            {
                workbook.SaveAs(stream);
                var content = stream.ToArray();
                return File(content, contentType, fileName);
            }
        }
    }
    catch (Exception ex)
    {
        return BadRequest(ErrorResultFormatter.PrepareErrorResult("",ex.Message));
    }
}

フレームワーク

私の Kubernetes サーバー情報は次のとおりです。

System.drawing.common the type initializer for 'gdip' threw an exception
*FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build WORKDIR /app
COPY *.csproj Nuget.Config ./ RUN dotnet restore /property:Configuration=Release
--configfile=Nuget.Config --no-cache --force
COPY . ./temp/ WORKDIR /app/temp RUN dotnet publish -c Release -o out FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime ENV ASPNETCORE_URLS="http://+" ENV ASPNETCORE_Kestrel__Certificates__Default__Password="*****" WORKDIR /app COPY --from=build /app/temp/out ./ ENTRYPOINT ["dotnet", "blahblah.dll"]*

サーバー側では、次のような例外が発生します: 「system.drawing.common 'gdip' の型初期化子が例外をスローしました」

Google で何度も検索しました。docker ファイルを追加するには、一般的にこの方法が推奨されています。

RUN apt-get install libgdiplus

しかし、この方法でも問題は解決しませんでした。誰か助けてくれませんか?

前もって感謝します。

ベストアンサー1

次のような Dockerfile があります:

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
RUN apt-get update && apt-get install -y apt-utils libgdiplus libc6-dev
        
WORKDIR /app
EXPOSE 80
EXPOSE 443
        
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ...
    
.
.
.
    
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "...dll"]

2 行目でコマンドを実行していますapt-get update and install。 あなたもこのようにコマンドを実行できます。 うまくいくことを願っています。

おすすめ記事