'NoDecodeDelegateForThisImageFormat' - Magick.NET в AWS Lambda Serverless API - PullRequest
0 голосов
/ 31 августа 2018

Я использую Magick.NET для изменения размера и сохранения изображений в AWS S3. У меня есть Lambda Serverless Web API, который принимает запросы для этого. Он работает нормально при локальном запуске, но не при вызове живой конечной точки на Lambda Я получаю следующее исключение:

{
    "Timestamp": "2018-08-31T09:26:40.2561647+00:00",
    "Level": "Error",
    "MessageTemplate": "### Error resizing image. ###",
    "Exception": "ImageMagick.MagickMissingDelegateErrorException: NoDecodeDelegateForThisImageFormat `' @ error/blob.c/BlobToImage/456\n   at TAP.Services.TourManagementService.<AddImage>d__24.MoveNext() in C:\\######\\TourManagementService.cs:line 180\n--- End of stack trace from previous location where exception was thrown ---\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\n   at TAP.API.Tours.Controllers.ImagesController.<Post>d__3.MoveNext() in C:\\######\\ImagesController.cs:line 44\n--- End of stack trace from previous location where exception was thrown ---\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\n   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()\n--- End of stack trace from previous location where exception was thrown ---\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\n   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextActionFilterAsync>d__10.MoveNext()\n--- End of stack trace from previous location where exception was thrown ---\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\n   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)\n   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)\n   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeInnerFilterAsync>d__14.MoveNext()\n--- End of stack trace from previous location where exception was thrown ---\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\n   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeNextExceptionFilterAsync>d__23.MoveNext()",
    "Properties": {
        "ExceptionDetail": {
            "HResult": -2146233088,
            "Message": "NoDecodeDelegateForThisImageFormat `' @ error/blob.c/BlobToImage/456",
            "Source": "Magick.NET-Q16-AnyCPU",
            "RelatedExceptions": [
                {
                    "RelatedExceptions": [],
                    "Message": "UnableToOpenConfigureFile `magic.xml' @ warning/configure.c/GetConfigureOptions/714",
                    "Data": {},
                    "InnerException": null,
                    "TargetSite": null,
                    "StackTrace": null,
                    "HelpLink": null,
                    "Source": null,
                    "HResult": -2146233088
                }
            ],
            "Type": "ImageMagick.MagickMissingDelegateErrorException"
        }
    }
}

Изображение, которое я пытаюсь загрузить, находится здесь: https://wetransfer.com/downloads/6e86e0008b49ac29399c8cc2103c667820180831084315/99efdf, а код, в котором я использую Magick.NET, выглядит следующим образом:

private byte[] resizeImage(byte[] imageData, int width, int height)
{
    using (var image = new MagickImage(imageData, new MagickReadSettings { Format = MagickFormat.Jpeg }))
    {
        image.Format = MagickFormat.Jpeg;
        image.Interlace = Interlace.Jpeg; // Make image progressive

        var geometry = new MagickGeometry(width, height);
        geometry.FillArea = true;

        try
        {
            image.Resize(geometry);
            image.Crop(width, height);
            image.RePage();
        }
        catch (Exception ex)
        {
            this.logger.Error(ex, "Error resizing image.");
            throw new ImageResizeException("Error resizing image.", ex);
        }

        return image.ToByteArray();
    }
}

Раньше у меня были проблемы с Lambda при попытке чтения из локальных файлов, поэтому я подумал, что UnableToOpenConfigureFile может быть аналогичной проблемой. Затем я использовал руководство GitHub (https://github.com/dlemstra/Magick.NET/blob/master/Documentation/Initialization.md), чтобы инициализировать MagickNET с использованием кода, а не полагаться на XML-файлы, например:

var configFiles = ConfigurationFiles.Default;
configFiles.Policy.Data = @"
    <policymap>
      <policy domain=""delegate"" rights=""none"" pattern=""*"" />
      <policy domain=""coder"" rights=""none"" pattern=""*"" />
      <policy domain=""coder"" rights=""read|write"" pattern=""{GIF,JPEG,PNG,WEBP}"" />
    </policymap>";
MagickNET.Initialize(configFiles);

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

EDIT:

Я также попытался включить файлы xml в проект и опубликовать их напрямую. enter image description here

Делая это, я должен сообщить Magick.NET, где искать файлы, поэтому я попытался сделать это с переменной окружения MAGICK_CONFIGURE_PATH в Lambda, которую я установил в "/ MagickNet". Другой метод, который я попробовал, - установить путь в MagickNET.Initialize примерно так:

MagickNET.Initialize("./MagickNet");

Это также не помогло мне.

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