Я использую 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 в проект и опубликовать их напрямую.
Делая это, я должен сообщить Magick.NET, где искать файлы, поэтому я попытался сделать это с переменной окружения MAGICK_CONFIGURE_PATH
в Lambda, которую я установил в "/ MagickNet". Другой метод, который я попробовал, - установить путь в MagickNET.Initialize
примерно так:
MagickNET.Initialize("./MagickNet");
Это также не помогло мне.