Проблема с привязкой свойств BlobTrigger в функциях Azure

Я пытаюсь создать функцию 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:

  • Microsoft.Azure.WebJobs.Extensions.Storage 4.0.3
  • Microsoft.NET.Sdk.Functions 3.0.11

Я видел аналогичное сообщение, в котором предлагалось удалить ссылку на компонент Extensions.Storage, но при этом удаляются атрибут [BlobTrigger] и другие типы, поэтому не работает. Связанные вопросы, похоже, относятся к 2018 году и относятся к более старым версиям функции Azure, конечно, это должно работать сразу же?

Ценю любые предложения, заранее благодарю.


person Ryan Thomas    schedule 10.12.2020    source источник
comment
Типы параметров лазурной функции ограничены. Почему вы не рассматриваете капли как объекты, подобные блочным, а как потоки? Я думаю, что такие классы, как blockblob, не должны вызывать проблем с сериализацией (похоже, я делал что-то подобное раньше). Должна быть возможность передать объект blob и управлять им, вы можете попробовать.   -  person Bowman Zhu    schedule 10.12.2020
comment
@BowmanZhu, извините, я не уверен, что понимаю, что вы имеете в виду, вы можете привести пример? Вы предлагаете изменить inputFile на тип CloudBlockBlob?   -  person Ryan Thomas    schedule 10.12.2020
comment
Я опубликовал ответ, можете посмотреть и попробовать.   -  person Bowman Zhu    schedule 11.12.2020


Ответы (1)


Просто сделайте так, как показано ниже:

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" />
person Bowman Zhu    schedule 11.12.2020
comment
Да, это нормально работает в версии 3.0.10, но не работает в версии 4.0.3. Спасибо за вашу помощь, я думаю, что пока я буду придерживаться Stream и буду использовать строку IDictionary ‹, строку› Привязка метаданных для проверки hdi_isfolder, а также я могу использовать {name}. {Extension} для фильтрации папок. :) - person Ryan Thomas; 11.12.2020
comment
В версии 3.0.10 также есть проблема с типом журнала, отсутствующим в словаре, но она решена в версии 3.0.11, и она работает должным образом. Спасибо. - person Ryan Thomas; 23.12.2020