Я пытаюсь создать функцию Azure, которая использует BlobTrigger для управления некоторыми файлами, а затем сохраняет их обратно в большой двоичный объект.
Для этого я хочу получить доступ к объекту BlobProperties, чтобы проверить Content-Type файла, чтобы убедиться, что он поддерживается моей процедурой манипуляции.
Насколько я понимаю из этой статьи, я должен просто иметь возможность добавить параметр в метод с именем Properties, который имеет тип BlobProperties, и я могу подтвердить, что это работает для других перечисленных типов метаданных.
Однако всякий раз, когда я добавляю свойства, мое приложение не работает и сообщает о следующей ошибке:
Ошибка функции «Function1»: Microsoft.Azure.WebJobs.Host: ошибка метода индексирования «Function1». Microsoft.Azure.WebJobs.Host: невозможно связать параметр «Свойства» с типом «Microsoft.WindowsAzure.Storage.Blob.BlobProperties».
Что я делаю не так? Ниже мой метод:
public static void Run([BlobTrigger("TestContainer/{name}", Connection = "AzureWebJobsStorage")] Stream inputFile,
string name, string BlobTrigger, IDictionary<string, string> Metadata, ILogger log, BlobProperties Properties)
Моя целевая платформа — .NET Core 3.1, а версия функций Azure — v3. У меня есть следующие пакеты NuGet:
Я видел аналогичный пост, в котором предлагалось удалить ссылку на компонент Extensions.Storage, но при этом удаляется атрибут [BlobTrigger] и другие типы, поэтому это не работает. Связанные вопросы, кажется, относятся к 2018 году и относятся к более старым версиям функции Azure. Конечно, это должно сработать?
Оцените любые предложения, спасибо заранее.
@BowmanZhu извините, я не уверен, что понимаю, что вы имеете в виду, вы можете привести пример? Вы предлагаете изменить inputFile на тип CloudBlockBlob?
Я отправил ответ, вы можете посмотреть и попробовать.
Просто сделайте, как показано ниже:
using System;
using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Blob;
namespace FunctionApp48
{
public static class Function1
{
[FunctionName("Function1")]
public static void Run([BlobTrigger("test/{name}", Connection = "str")]CloudBlockBlob myBlob, string name, ILogger log)
{
string a = myBlob.Properties.ContentType;
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Properties.Length} Bytes"+"\n"+a);
}
}
}
Я могу успешно получить тип содержимого blob:
И эталонный пакет:
<PackageReference Include = "Microsoft.Azure.WebJobs.Extensions.Storage" Version = "3.0.10" />
<PackageReference Include = "Microsoft.NET.Sdk.Functions" Version = "3.0.11" />
Да, это отлично работает в версии 3.0.10, но не работает в 4.0.3. Спасибо за вашу помощь, я думаю, что пока я буду придерживаться использования Stream и использовать привязку метаданных IDictionary<string, string> для проверки «hdi_isfolder», и я также могу использовать {name}.{extension} для фильтрации папки тоже :)
В версии 3.0.10 также есть проблема с «типом журнала, отсутствующим в словаре», но она решена в версии 3.0.11, и она работает должным образом. Спасибо.
WindowsAzure.Storage является устаревшим, Azure.Storage.Blobs тоже кажется неправильным. Попробуйте удалить их, а также добавить пакет NuGet Microsoft.Azure.Storage.Blob.
Типы параметров функции Azure ограничены. Почему вы не рассматриваете BLOB-объекты как объекты, такие как blockblob, а как потоки? Я думаю, что такие классы, как blockblob, не должны вызывать проблем с сериализацией (кажется, я делал что-то подобное раньше). Должна быть возможность передать объект blob и управлять им, вы можете попробовать.