Привязки хранилища BLOB-объектов Azure для службы "Функции Azure"Azure Blob storage bindings for Azure Functions

В этой статье рассматривается работа с привязками хранилища BLOB-объектов Azure в службе "Функции Azure".This article explains how to work with Azure Blob storage bindings in Azure Functions. Служба "Функции Azure" поддерживает привязки триггера, а также входные и выходные привязки для больших двоичных объектов.Azure Functions supports trigger, input, and output bindings for blobs. В этой статье каждой из следующих привязок посвящен раздел:The article includes a section for each binding:

Это справочные сведения для разработчиков функций Azure.This is reference information for Azure Functions developers. Если вы новичок в функциях Azure, начните со следующих ресурсов:If you're new to Azure Functions, start with the following resources:

Примечание

Используйте триггер службы "Сетка событий" вместо триггера хранилища BLOB-объектов для учетных записей хранения только для больших двоичных объектов, чтобы обеспечить высокий уровень масштабирования или сократить задержку.Use the Event Grid trigger instead of the Blob storage trigger for blob-only storage accounts, for high scale, or to reduce latency. Дополнительные сведения см. в разделе Триггер.For more information, see the Trigger section.

Пакеты – Функции 1.xPackages - Functions 1.x

Привязки большого двоичного объекта доступны в пакете NuGet Microsoft.Azure.WebJobs, версия 2.х.The Blob storage bindings are provided in the Microsoft.Azure.WebJobs NuGet package, version 2.x. Исходный код для пакета находится в репозитории GitHub azure-webjobs-sdk.Source code for the package is in the azure-webjobs-sdk GitHub repository.

Поддержка этой привязки автоматически предоставляется во всех средах разработки.Support for this binding is automatically provided in all development environments. Не нужно вручную устанавливать пакет или регистрировать расширение.You don't have to manually install the package or register the extension.

Версия пакета SDK для службы хранилища Azure в решении "Функции" 1.xAzure Storage SDK version in Functions 1.x

В решении "Функции" 1.x триггеры и привязки службы хранилища используют версию 7.2.1 пакета SDK для службы хранилища Azure (пакет NuGet WindowsAzure.Storage).In Functions 1.x, the Storage triggers and bindings use version 7.2.1 of the Azure Storage SDK (WindowsAzure.Storage NuGet package). Если указать другую версию пакета SDK для службы хранилища и использовать привязку к типу пакета SDK для службы хранилища в сигнатуре функции, то среда выполнения "Функции" может сообщить, что выполнить привязку к этому типу невозможно.If you reference a different version of the Storage SDK, and you bind to a Storage SDK type in your function signature, the Functions runtime may report that it can't bind to that type. Чтобы избежать этого, убедитесь, в вашем проекте указан пакет WindowsAzure.Storage 7.2.1.The solution is to make sure your project references WindowsAzure.Storage 7.2.1.

Packages — функции 2. x и более поздних версийPackages - Functions 2.x and higher

Привязки хранилища BLOB-объектов доступны в пакете NuGet Microsoft.Azure.WebJobs.Extensions.Storage версии 3.х.The Blob storage bindings are provided in the Microsoft.Azure.WebJobs.Extensions.Storage NuGet package, version 3.x. Исходный код для пакета находится в репозитории GitHub azure-webjobs-sdk.Source code for the package is in the azure-webjobs-sdk GitHub repository.

В следующей таблице указано как добавить поддержку для этой привязки в каждой среде разработки.The following table tells how to add support for this binding in each development environment.

Среда разработкиDevelopment environment Добавление поддержкиTo add support
Локальная разработка – библиотека классов C#Local development - C# class library Установка пакетаInstall the package
Локальная разработка — скрипт C#, JavaScript, F#, Java и PythonLocal development - C# script, JavaScript, F#, Java and Python Регистрация расширенияRegister the extension
Разработка на порталеPortal development Установка при добавлении выходной привязкиInstall when adding output binding

Дополнительные сведения об обновлении существующих расширений привязки на портале, не переиздавая проект приложения-функции, см. раздел Обновление расширений.To learn how to update existing binding extensions in the portal without having to republish your function app project, see Update your extensions.

ТриггерTrigger

Триггер хранилища BLOB-объектов запускает функцию при обнаружении нового или обновленного большого двоичного объекта.The Blob storage trigger starts a function when a new or updated blob is detected. Содержимое BLOB-объекта предоставляется в качестве входных данных функции.The blob contents are provided as input to the function.

Триггер службы "Сетка событий" имеет встроенную поддержку событий больших двоичных объектов. Кроме того, его можно использовать для запуска функции при обнаружении нового или обновленного большого двоичного объекта.The Event Grid trigger has built-in support for blob events and can also be used to start a function when a new or updated blob is detected. Пример см. в руководстве Автоматическое изменение размера переданных изображений с помощью службы "Сетка событий".For an example, see the Image resize with Event Grid tutorial.

Используйте службу "Сетка событий" вместо триггера хранилища BLOB-объектов для следующих сценариев:Use Event Grid instead of the Blob storage trigger for the following scenarios:

  • Учетные записи хранения BLOB-объектовBlob storage accounts
  • Большой масштабHigh scale
  • Минимизация задержкиMinimizing latency

Учетные записи хранения BLOB-объектовBlob storage accounts

Учетные записи хранения больших двоичных объектов поддерживаются для входных и выходных привязок больших двоичных объектов, а не для триггеров большого двоичного объекта.Blob storage accounts are supported for blob input and output bindings but not for blob triggers. Для триггеров хранилища BLOB-объектов требуется учетная запись хранения общего назначения.Blob storage triggers require a general-purpose storage account.

Большой масштабHigh scale

Большой масштаб можно определить как контейнеры, содержащие более 100 000 больших двоичных объектов, или как учетные записи хранения, в которых выполняется более 100 обновлений больших двоичных объектов в секунду.High scale can be loosely defined as containers that have more than 100,000 blobs in them or storage accounts that have more than 100 blob updates per second.

Проблемы с задержкойLatency issues

Если ваше приложение-функция выполняется в рамках плана потребления, обработка новых больших двоичных объектов может осуществляться с задержкой до 10 минут, если приложение-функция стало неактивным.If your function app is on the Consumption plan, there can be up to a 10-minute delay in processing new blobs if a function app has gone idle. Чтобы избежать этой задержки, можно переключиться на план службы приложений с включенным решением Always On.To avoid this latency, you can switch to an App Service plan with Always On enabled. Можно также использовать триггер сетки событий с вашей учетной записью хранилища BLOB-объектов.You can also use an Event Grid trigger with your Blob storage account. Пример см. в руководстве по Сетке событий.For an example, see the Event Grid tutorial.

Триггер хранилища очередейQueue storage trigger

Помимо службы "Сетка событий" для обработки больших двоичных объектов можно использовать триггер хранилища очередей, но он не имеет встроенной поддержки для событий большого двоичного объекта.Besides Event Grid, another alternative for processing blobs is the Queue storage trigger, but it has no built-in support for blob events. При создании или обновлении больших двоичных объектов вам придется создавать сообщения очереди.You would have to create queue messages when creating or updating blobs. Пример см. в этом разделе.For an example that assumes you've done that, see the blob input binding example later in this article.

Пример триггераTrigger - example

В следующем примере показана функция C#, которая добавляет запись в журнал при добавлении или обновлении большого двоичного объекта в контейнере samples-workitems.The following example shows a C# function that writes a log when a blob is added or updated in the samples-workitems container.

[FunctionName("BlobTriggerCSharp")]        
public static void Run([BlobTrigger("samples-workitems/{name}")] Stream myBlob, string name, ILogger log)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}

Строка {name} в пути триггера большого двоичного объекта samples-workitems/{name} создает выражение привязки, которое можно использовать в коде функции для получения доступа к имени файла большого двоичного объекта, запускающего триггер.The string {name} in the blob trigger path samples-workitems/{name} creates a binding expression that you can use in function code to access the file name of the triggering blob. Дополнительные сведения см. в разделе Шаблоны имени большого двоичного объекта.For more information, see Blob name patterns later in this article.

Дополнительные сведения об атрибуте BlobTrigger см. в разделе Атрибуты триггера для предкомпилированного кода C#.For more information about the BlobTrigger attribute, see Trigger - attributes.

Атрибуты триггераTrigger - attributes

В библиотеках классов C# используйте следующие атрибуты для настройки триггера большого двоичного объекта:In C# class libraries, use the following attributes to configure a blob trigger:

  • BlobTriggerAttributeBlobTriggerAttribute

    Конструктор атрибута принимает строку пути, которая указывает на контейнер для просмотра, и при необходимости шаблон имени большого двоичного объекта.The attribute's constructor takes a path string that indicates the container to watch and optionally a blob name pattern. Ниже приведен пример:Here's an example:

    [FunctionName("ResizeImage")]
    public static void Run(
        [BlobTrigger("sample-images/{name}")] Stream image,
        [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
    {
        ....
    }
    

    Чтобы указать учетную запись хранения, которую нужно использовать, можно задать свойство Connection, как показано в следующем примере.You can set the Connection property to specify the storage account to use, as shown in the following example:

    [FunctionName("ResizeImage")]
    public static void Run(
        [BlobTrigger("sample-images/{name}", Connection = "StorageConnectionAppSetting")] Stream image,
        [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
    {
        ....
    }
    

    Полный пример см. в разделе пример триггера.For a complete example, see Trigger example.

  • StorageAccountAttributeStorageAccountAttribute

    Предоставляет еще один способ указать используемую учетную запись хранения.Provides another way to specify the storage account to use. Конструктор принимает имя параметра приложения, содержащего строку подключения к службе хранилища.The constructor takes the name of an app setting that contains a storage connection string. Атрибут может применяться на уровне класса, метода или параметра.The attribute can be applied at the parameter, method, or class level. Ниже показан пример уровня класса и метода.The following example shows class level and method level:

    [StorageAccount("ClassLevelStorageAppSetting")]
    public static class AzureFunctions
    {
        [FunctionName("BlobTrigger")]
        [StorageAccount("FunctionLevelStorageAppSetting")]
        public static void Run( //...
    {
        ....
    }
    

Используемая учетная запись хранения определяется в следующем порядке:The storage account to use is determined in the following order:

  • Свойство BlobTrigger атрибута Connection.The BlobTrigger attribute's Connection property.
  • Атрибут StorageAccount, примененный к тому же параметру, что и BlobTrigger.The StorageAccount attribute applied to the same parameter as the BlobTrigger attribute.
  • Атрибут StorageAccount, примененный к функции.The StorageAccount attribute applied to the function.
  • Атрибут StorageAccount, примененный к классу.The StorageAccount attribute applied to the class.
  • Учетная запись хранения по умолчанию для приложения-функции (параметр приложения AzureWebJobsStorage).The default storage account for the function app ("AzureWebJobsStorage" app setting).

Конфигурация триггераTrigger - configuration

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json и атрибуте BlobTrigger.The following table explains the binding configuration properties that you set in the function.json file and the BlobTrigger attribute.

свойство function.jsonfunction.json property Свойство атрибутаAttribute property DescriptionDescription
typetype Н/Дn/a Нужно задать значение blobTrigger.Must be set to blobTrigger. Это свойство задается автоматически при создании триггера на портале Azure.This property is set automatically when you create the trigger in the Azure portal.
directiondirection Н/Дn/a Нужно задать значение in.Must be set to in. Это свойство задается автоматически при создании триггера на портале Azure.This property is set automatically when you create the trigger in the Azure portal. Исключения приведены в этом разделе.Exceptions are noted in the usage section.
namename Н/Дn/a Имя переменной, представляющей большой двоичный объект в коде функции.The name of the variable that represents the blob in function code.
путьpath BlobPathBlobPath Контейнер для мониторинга.The container to monitor. Может быть шаблоном имени большого двоичного объекта.May be a blob name pattern.
connectionconnection СоединениеConnection Имя параметра приложения, содержащего строку подключения к службе хранилища, используемой для этой привязки.The name of an app setting that contains the Storage connection string to use for this binding. Если имя параметра приложения начинается с AzureWebJobs, можно указать только остальную часть имени.If the app setting name begins with "AzureWebJobs", you can specify only the remainder of the name here. Например, если для connection задано значение "MyStorage", среда выполнения функций ищет параметр приложения с именем "MyStorage".For example, if you set connection to "MyStorage", the Functions runtime looks for an app setting that is named "MyStorage." Если оставить строку connection пустой, среда выполнения службы "Функции" будет использовать строку подключения к службе хранилища по умолчанию для параметра приложения с именем AzureWebJobsStorage.If you leave connection empty, the Functions runtime uses the default Storage connection string in the app setting that is named AzureWebJobsStorage.

Строка подключения необходима для учетной записи хранения общего назначения, а не учетной записи хранения больших двоичных объектов.The connection string must be for a general-purpose storage account, not a Blob storage account.

При локальной разработке параметры приложения перейдут в файл local.settings.json.When you're developing locally, app settings go into the local.settings.json file.

Использование триггераTrigger - usage

Для активируемого BLOB-объекта можно использовать следующие типы параметров:You can use the following parameter types for the triggering blob:

  • Stream
  • TextReader
  • string
  • Byte[]
  • объект POCO, сериализуемый как JSON;A POCO serializable as JSON
  • ICloudBlob1ICloudBlob1
  • CloudBlockBlob1CloudBlockBlob1
  • CloudPageBlob1CloudPageBlob1
  • CloudAppendBlob1CloudAppendBlob1

1 Требует привязки inout direction в файле function.json или FileAccess.ReadWrite в библиотеке классов C#.1 Requires "inout" binding direction in function.json or FileAccess.ReadWrite in a C# class library.

Если при попытке привязаться к одному из типов SDK для службы хранилища получено сообщение об ошибке, убедитесь, что у вас есть ссылка на правильную версию пакета SDK для службы хранилища.If you try to bind to one of the Storage SDK types and get an error message, make sure that you have a reference to the correct Storage SDK version.

Привязку к string, Byte[] или POCO рекомендуется использовать, только если большой двоичный объект имеет небольшой размер, так как в память загружается все содержимое большого двоичного объекта.Binding to string, Byte[], or POCO is only recommended if the blob size is small, as the entire blob contents are loaded into memory. Как правило, предпочтительнее использовать тип Stream или CloudBlockBlob.Generally, it is preferable to use a Stream or CloudBlockBlob type. Дополнительные сведения см. в разделе о параллелизме и использовании памяти далее в этой статье.For more information, see Concurrency and memory usage later in this article.

Шаблоны имени большого двоичного объекта в триггереTrigger - blob name patterns

Вы можете указать шаблон имени большого двоичного объекта в свойстве path в файле function.json или в конструкторе атрибута BlobTrigger.You can specify a blob name pattern in the path property in function.json or in the BlobTrigger attribute constructor. Шаблон имени может быть выражением фильтра или привязки.The name pattern can be a filter or binding expression. Примеры приведены в следующих разделах.The following sections provide examples.

Получение имени и расширения файлаGet file name and extension

В следующем примере показано, как выполнить привязку имени и расширения файла большого двоичного объекта по отдельности:The following example shows how to bind to the blob file name and extension separately:

"path": "input/{blobname}.{blobextension}",

Если большой двоичный объект имеет имя original-Blob1.txt, он передает в код функции переменные blobname и blobextension со значениями original-Blob1 и txt соответственно.If the blob is named original-Blob1.txt, the values of the blobname and blobextension variables in function code are original-Blob1 and txt.

Фильтрация по имени большого двоичного объектаFilter on blob name

Следующий пример активируется только для больших двоичных объектов в контейнере input, который начинается со строки original-.The following example triggers only on blobs in the input container that start with the string "original-":

"path": "input/original-{name}",

Если original-Blob1.txt — имя большого двоичного объекта, значением переменной name в коде функции будет Blob1.If the blob name is original-Blob1.txt, the value of the name variable in function code is Blob1.

Фильтрация по типу файлаFilter on file type

Далее приведены примеры триггеров только из файлов PNG:The following example triggers only on .png files:

"path": "samples/{name}.png",

Фильтрация по фигурным скобкам в именах файловFilter on curly braces in file names

Чтобы найти фигурные скобки в именах файлов, экранируйте скобки, используя две фигурные скобки.To look for curly braces in file names, escape the braces by using two braces. В следующем примере показана фильтрация по большим двоичным объектам, имена которых содержат фигурные скобки:The following example filters for blobs that have curly braces in the name:

"path": "images/{{20140101}}-{name}",

Если {20140101}-soundfile.mp3 — имя большого двоичного объекта, значением переменной name в коде функции будет soundfile.mp3.If the blob is named {20140101}-soundfile.mp3, the name variable value in the function code is soundfile.mp3.

Метаданные триггераTrigger - metadata

Триггер BLOB-объектов предоставляет несколько свойств метаданных.The blob trigger provides several metadata properties. Эти свойства можно использовать как часть выражений привязки в других привязках или как параметры в коде.These properties can be used as part of binding expressions in other bindings or as parameters in your code. Эти значения имеют ту же семантику, что и тип CloudBlob.These values have the same semantics as the CloudBlob type.

СвойствоProperty typeType ОписаниеDescription
BlobTrigger string Путь к большому двоичному объекту, активирующему триггер.The path to the triggering blob.
Uri System.Uri Код URI BLOB-объекта для основного расположения.The blob's URI for the primary location.
Properties BlobPropertiesBlobProperties Системные свойства BLOB-объекта.The blob's system properties.
Metadata IDictionary<string,string> Определяемые пользователем метаданные для BLOB-объекта.The user-defined metadata for the blob.

Например, следующие примеры скрипта C# и JavaScript записывают путь в большой двоичный объект, активирующий триггер, вместе с контейнером:For example, the following C# script and JavaScript examples log the path to the triggering blob, including the container:

public static void Run(string myBlob, string blobTrigger, ILogger log)
{
    log.LogInformation($"Full blob path: {blobTrigger}");
} 

Уведомления о получении большого двоичного объекта в триггереTrigger - blob receipts

Среда выполнения Функций Azure гарантирует, что для одного и того же нового или обновленного BLOB-объекта функция активации BLOB-объекта будет вызываться только один раз.The Azure Functions runtime ensures that no blob trigger function gets called more than once for the same new or updated blob. Для определения того, обработана ли версия этого BLOB-объекта, сохраняются уведомления о получении BLOB-объекта.To determine if a given blob version has been processed, it maintains blob receipts.

Функции Azure сохраняют уведомления о получении BLOB-объектов в контейнере с именем azure-webjobs-hosts в учетной записи хранения Azure для приложения-функции (указывается с помощью параметра приложения AzureWebJobsStorage).Azure Functions stores blob receipts in a container named azure-webjobs-hosts in the Azure storage account for your function app (defined by the app setting AzureWebJobsStorage). Уведомление о получении большого двоичного объекта содержит следующую информацию:A blob receipt has the following information:

  • активированная функция ( <имя_приложения-функции> .Functions. <имя_функции> , например: MyFunctionApp.Functions.CopyBlob);The triggered function ("<function app name>.Functions.<function name>", for example: "MyFunctionApp.Functions.CopyBlob")
  • имя контейнера;The container name
  • тип большого двоичного объекта (BlockBlob или PageBlob);The blob type ("BlockBlob" or "PageBlob")
  • имя большого двоичного объекта;The blob name
  • ETag (идентификатор версии больших двоичных объектов, например 0x8D1DC6E70A277EF).The ETag (a blob version identifier, for example: "0x8D1DC6E70A277EF")

Чтобы выполнить принудительную повторную обработку большого двоичного объекта, удалите уведомление о получении этого большого двоичного объекта из контейнера azure-webjobs-hosts вручную.To force reprocessing of a blob, delete the blob receipt for that blob from the azure-webjobs-hosts container manually. Хотя повторная обработка может не выполняться немедленно, она гарантированно будет выполняться в более поздний момент времени.While reprocessing might not occur immediately, it's guaranteed to occur at a later point in time.

Триггеры подозрительных больших двоичных объектовTrigger - poison blobs

При сбое функции триггера BLOB-объекта Функции Azure по умолчанию выполняют ее для этого BLOB-объекта еще 5 раз.When a blob trigger function fails for a given blob, Azure Functions retries that function a total of 5 times by default.

В случае сбоя после 5 попыток запуска Функции Azure добавляют сообщение в очередь службы хранилища с именем webjobs-blobtrigger-poison.If all 5 tries fail, Azure Functions adds a message to a Storage queue named webjobs-blobtrigger-poison. Сообщением очереди для подозрительных больших двоичных объектов является объект JSON, содержащий следующие свойства:The queue message for poison blobs is a JSON object that contains the following properties:

  • FunctionId (идентификатор функции в формате <имя_приложения-функции> .Functions. <имя_функции> );FunctionId (in the format <function app name>.Functions.<function name>)
  • BlobType (BlockBlob или PageBlob);BlobType ("BlockBlob" or "PageBlob")
  • ContainerName;ContainerName
  • BlobNameBlobName
  • ETag (идентификатор версии BLOB-объектов, например 0x8D1DC6E70A277EF)ETag (a blob version identifier, for example: "0x8D1DC6E70A277EF")

Триггеры параллелизма и использования памятиTrigger - concurrency and memory usage

Триггер больших двоичных объектов использует очередь для внутренних целей, поэтому максимальное число параллельных вызовов функции регулируется конфигурацией очередей в host.json.The blob trigger uses a queue internally, so the maximum number of concurrent function invocations is controlled by the queues configuration in host.json. При настройках по умолчанию параллелизм ограничен 24 вызовами.The default settings limit concurrency to 24 invocations. Это ограничение применяется отдельно к каждой функции, которая использует триггер больших двоичных объектов.This limit applies separately to each function that uses a blob trigger.

План потребления ограничивает приложение-функцию на одной виртуальной машине (ВМ) до 1,5 ГБ памяти.The Consumption plan limits a function app on one virtual machine (VM) to 1.5 GB of memory. Память используется каждым параллельно выполняющимся экземпляром функции и самой средой выполнения службы "Функции".Memory is used by each concurrently executing function instance and by the Functions runtime itself. Если функция, запускаемая триггером больших двоичных объектов, загружает весь такой объект в память, максимальный объем памяти, используемый этой функцией только для больших двоичных объектов, составит 24 * максимальный размер такого объекта.If a blob-triggered function loads the entire blob into memory, the maximum memory used by that function just for blobs is 24 * maximum blob size. Например, приложение-функция с тремя функциями, запускаемыми триггером больших двоичных объектов, с настройками по умолчанию будет иметь максимальную степень параллелизма на одну виртуальную машину, равную 3 * 24 = 72 вызова функций.For example, a function app with three blob-triggered functions and the default settings would have a maximum per-VM concurrency of 3*24 = 72 function invocations.

Функции JavaScript и Java загружают весь большой двоичный объект в память, а функции C# делают это в случае привязки к string, Byte[] или POCO.JavaScript and Java functions load the entire blob into memory, and C# functions do that if you bind to string, Byte[], or POCO.

Триггер опросаTrigger - polling

Опрос работает как гибрид между проверками журналов и выполнения периодических просмотров контейнеров.Polling works as a hybrid between inspecting logs and running periodic container scans. Большие двоичные объекты проверяются в группах 10 000 за раз с токеном продолжения, используемым между интервалами.Blobs are scanned in groups of 10,000 at a time with a continuation token used between intervals.

Предупреждение

Кроме того, журналы службы хранилища создаются по принципу лучшего из возможного,In addition, storage logs are created on a "best effort" basis. Регистрация всех событий не гарантируется.There's no guarantee that all events are captured. В некоторых случаях журналы могут пропускаться.Under some conditions, logs may be missed.

Если требуется повысить скорость или надежность обработки BLOB-объектов, при создании BLOB-объекта рекомендуем создать сообщение очереди.If you require faster or more reliable blob processing, consider creating a queue message when you create the blob. Затем для обработки BLOB-объекта используйте триггер очереди вместо триггера BLOB-объекта.Then use a queue trigger instead of a blob trigger to process the blob. Другой вариант — использовать службу "Сетка событий". Дополнительные сведения см. в руководстве Автоматическое изменение размера переданных изображений с помощью службы "Сетка событий".Another option is to use Event Grid; see the tutorial Automate resizing uploaded images using Event Grid.

Входные данныеInput

Для чтения больших двоичных объектов используйте входную привязку хранилища BLOB-объектов.Use a Blob storage input binding to read blobs.

Пример входных данныхInput - example

Ниже приведен пример функции C#, которая использует триггер очереди и входную привязку большого двоичного объекта.The following example is a C# function that uses a queue trigger and an input blob binding. Сообщение в очереди содержит имя большого двоичного объекта, а функция записывает в журнал размер большого двоичного объекта.The queue message contains the name of the blob, and the function logs the size of the blob.

[FunctionName("BlobInput")]
public static void Run(
    [QueueTrigger("myqueue-items")] string myQueueItem,
    [Blob("samples-workitems/{queueTrigger}", FileAccess.Read)] Stream myBlob,
    ILogger log)
{
    log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}

Входные атрибутыInput - attributes

В библиотеках классов C# используйте BlobAttribute.In C# class libraries, use the BlobAttribute.

Конструктор атрибута принимает путь к большому двоичному объекту и параметр FileAccess, указывающий на чтение или запись, как показано в следующем примере:The attribute's constructor takes the path to the blob and a FileAccess parameter indicating read or write, as shown in the following example:

[FunctionName("BlobInput")]
public static void Run(
    [QueueTrigger("myqueue-items")] string myQueueItem,
    [Blob("samples-workitems/{queueTrigger}", FileAccess.Read)] Stream myBlob,
    ILogger log)
{
    log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}

Чтобы указать учетную запись хранения, которую нужно использовать, можно задать свойство Connection, как показано в следующем примере.You can set the Connection property to specify the storage account to use, as shown in the following example:

[FunctionName("BlobInput")]
public static void Run(
    [QueueTrigger("myqueue-items")] string myQueueItem,
    [Blob("samples-workitems/{queueTrigger}", FileAccess.Read, Connection = "StorageConnectionAppSetting")] Stream myBlob,
    ILogger log)
{
    log.LogInformation($"BlobInput processed blob\n Name:{myQueueItem} \n Size: {myBlob.Length} bytes");
}

Чтобы указать учетную запись хранения на уровне класса, метода или параметра, можно использовать атрибут StorageAccount.You can use the StorageAccount attribute to specify the storage account at class, method, or parameter level. Дополнительные сведения см. в разделе Атрибуты триггера для предкомпилированного кода C#.For more information, see Trigger - attributes.

Входная конфигурацияInput - configuration

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json и атрибуте Blob.The following table explains the binding configuration properties that you set in the function.json file and the Blob attribute.

свойство function.jsonfunction.json property Свойство атрибутаAttribute property DescriptionDescription
typetype Н/Дn/a Нужно задать значение blob.Must be set to blob.
directiondirection Н/Дn/a Нужно задать значение in.Must be set to in. Исключения приведены в этом разделе.Exceptions are noted in the usage section.
namename Н/Дn/a Имя переменной, представляющей большой двоичный объект в коде функции.The name of the variable that represents the blob in function code.
путьpath BlobPathBlobPath Путь к BLOB-объекту.The path to the blob.
connectionconnection СоединениеConnection Имя параметра приложения, содержащего строку подключения к службе хранилища, используемой для этой привязки.The name of an app setting that contains the Storage connection string to use for this binding. Если имя параметра приложения начинается с AzureWebJobs, можно указать только остальную часть имени.If the app setting name begins with "AzureWebJobs", you can specify only the remainder of the name here. Например, если для connection задано значение "MyStorage", среда выполнения функций ищет параметр приложения с именем "MyStorage".For example, if you set connection to "MyStorage", the Functions runtime looks for an app setting that is named "MyStorage." Если оставить строку connection пустой, среда выполнения службы "Функции" будет использовать строку подключения к службе хранилища по умолчанию для параметра приложения с именем AzureWebJobsStorage.If you leave connection empty, the Functions runtime uses the default Storage connection string in the app setting that is named AzureWebJobsStorage.

Строка подключения необходима для учетной записи хранения общего назначения, а не учетной записи хранения только для больших двоичных объектов.The connection string must be for a general-purpose storage account, not a blob-only storage account.
Н/Дn/a ДоступAccess Указывает, какая операция будет выполняться (запись или чтение).Indicates whether you will be reading or writing.

При локальной разработке параметры приложения перейдут в файл local.settings.json.When you're developing locally, app settings go into the local.settings.json file.

Использование входной привязкиInput - usage

Для входной привязки BLOB-объектов можно использовать следующие типы параметров:You can use the following parameter types for the blob input binding:

  • Stream
  • TextReader
  • string
  • Byte[]
  • CloudBlobContainer
  • CloudBlobDirectory
  • ICloudBlob1ICloudBlob1
  • CloudBlockBlob1CloudBlockBlob1
  • CloudPageBlob1CloudPageBlob1
  • CloudAppendBlob1CloudAppendBlob1

1 Требует привязки inout direction в файле function.json или FileAccess.ReadWrite в библиотеке классов C#.1 Requires "inout" binding direction in function.json or FileAccess.ReadWrite in a C# class library.

Если при попытке привязаться к одному из типов SDK для службы хранилища получено сообщение об ошибке, убедитесь, что у вас есть ссылка на правильную версию пакета SDK для службы хранилища.If you try to bind to one of the Storage SDK types and get an error message, make sure that you have a reference to the correct Storage SDK version.

Привязку к string или Byte[] рекомендуется использовать, только если большой двоичный объект имеет небольшой размер, так как в память загружается все содержимое большого двоичного объекта.Binding to string or Byte[] is only recommended if the blob size is small, as the entire blob contents are loaded into memory. Как правило, предпочтительнее использовать тип Stream или CloudBlockBlob.Generally, it is preferable to use a Stream or CloudBlockBlob type. Дополнительные сведения см. в разделе о параллелизме и использовании памяти выше в этой статье.For more information, see Concurrency and memory usage earlier in this article.

Выходные данныеOutput

Используйте выходные привязки хранилища BLOB-объектов для записи больших двоичных объектов.Use Blob storage output bindings to write blobs.

Пример выходных данныхOutput - example

Ниже приведен пример функции C#, которая использует триггер большого двоичного объекта и две выходные привязки больших двоичных объектов.The following example is a C# function that uses a blob trigger and two output blob bindings. Эта функция активируется путем создания большого двоичного объекта образа в контейнере sample-images.The function is triggered by the creation of an image blob in the sample-images container. Она создает небольшие и средние копии большого двоичного объекта образа.It creates small and medium size copies of the image blob.

using System.Collections.Generic;
using System.IO;
using Microsoft.Azure.WebJobs;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;

public class ResizeImages
{
    [FunctionName("ResizeImage")]
    public static void Run([BlobTrigger("sample-images/{name}")] Stream image,
        [Blob("sample-images-sm/{name}", FileAccess.Write)] Stream imageSmall,
        [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageMedium)
    {
        IImageFormat format;

        using (Image<Rgba32> input = Image.Load<Rgba32>(image, out format))
        {
            ResizeImage(input, imageSmall, ImageSize.Small, format);
        }

        image.Position = 0;
        using (Image<Rgba32> input = Image.Load<Rgba32>(image, out format))
        {
            ResizeImage(input, imageMedium, ImageSize.Medium, format);
        }
    }

    public static void ResizeImage(Image<Rgba32> input, Stream output, ImageSize size, IImageFormat format)
    {
        var dimensions = imageDimensionsTable[size];

        input.Mutate(x => x.Resize(dimensions.Item1, dimensions.Item2));
        input.Save(output, format);
    }

    public enum ImageSize { ExtraSmall, Small, Medium }

    private static Dictionary<ImageSize, (int, int)> imageDimensionsTable = new Dictionary<ImageSize, (int, int)>() {
        { ImageSize.ExtraSmall, (320, 200) },
        { ImageSize.Small,      (640, 400) },
        { ImageSize.Medium,     (800, 600) }
    };

}

Выходные атрибутыOutput - attributes

В библиотеках классов C# используйте BlobAttribute.In C# class libraries, use the BlobAttribute.

Конструктор атрибута принимает путь к большому двоичному объекту и параметр FileAccess, указывающий на чтение или запись, как показано в следующем примере:The attribute's constructor takes the path to the blob and a FileAccess parameter indicating read or write, as shown in the following example:

[FunctionName("ResizeImage")]
public static void Run(
    [BlobTrigger("sample-images/{name}")] Stream image,
    [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageSmall)
{
    ...
}

Чтобы указать учетную запись хранения, которую нужно использовать, можно задать свойство Connection, как показано в следующем примере.You can set the Connection property to specify the storage account to use, as shown in the following example:

[FunctionName("ResizeImage")]
public static void Run(
    [BlobTrigger("sample-images/{name}")] Stream image,
    [Blob("sample-images-md/{name}", FileAccess.Write, Connection = "StorageConnectionAppSetting")] Stream imageSmall)
{
    ...
}

Полный пример см. в разделе пример выходных данных.For a complete example, see Output example.

Чтобы указать учетную запись хранения на уровне класса, метода или параметра, можно использовать атрибут StorageAccount.You can use the StorageAccount attribute to specify the storage account at class, method, or parameter level. Дополнительные сведения см. в разделе Атрибуты триггера для предкомпилированного кода C#.For more information, see Trigger - attributes.

Выходная конфигурацияOutput - configuration

В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json и атрибуте Blob.The following table explains the binding configuration properties that you set in the function.json file and the Blob attribute.

свойство function.jsonfunction.json property Свойство атрибутаAttribute property DescriptionDescription
typetype Н/Дn/a Нужно задать значение blob.Must be set to blob.
directiondirection Н/Дn/a Нужно задать значение out для выходной привязки.Must be set to out for an output binding. Исключения приведены в этом разделе.Exceptions are noted in the usage section.
namename Н/Дn/a Имя переменной, представляющей большой двоичный объект в коде функции.The name of the variable that represents the blob in function code. Задайте значение $return, ссылающееся на возвращаемое значение функции.Set to $return to reference the function return value.
путьpath BlobPathBlobPath Путь к контейнеру больших двоичных объектов.The path to the blob container.
connectionconnection СоединениеConnection Имя параметра приложения, содержащего строку подключения к службе хранилища, используемой для этой привязки.The name of an app setting that contains the Storage connection string to use for this binding. Если имя параметра приложения начинается с AzureWebJobs, можно указать только остальную часть имени.If the app setting name begins with "AzureWebJobs", you can specify only the remainder of the name here. Например, если для connection задано значение "MyStorage", среда выполнения функций ищет параметр приложения с именем "MyStorage".For example, if you set connection to "MyStorage", the Functions runtime looks for an app setting that is named "MyStorage." Если оставить строку connection пустой, среда выполнения службы "Функции" будет использовать строку подключения к службе хранилища по умолчанию для параметра приложения с именем AzureWebJobsStorage.If you leave connection empty, the Functions runtime uses the default Storage connection string in the app setting that is named AzureWebJobsStorage.

Строка подключения необходима для учетной записи хранения общего назначения, а не учетной записи хранения только для больших двоичных объектов.The connection string must be for a general-purpose storage account, not a blob-only storage account.
Н/Дn/a ДоступAccess Указывает, какая операция будет выполняться (запись или чтение).Indicates whether you will be reading or writing.

При локальной разработке параметры приложения перейдут в файл local.settings.json.When you're developing locally, app settings go into the local.settings.json file.

Использование выходной привязкиOutput - usage

Для записи больших двоичных объектов можно выполнить привязку к следующим типам:You can bind to the following types to write blobs:

  • TextWriter
  • out string
  • out Byte[]
  • CloudBlobStream
  • Stream
  • CloudBlobContainer1CloudBlobContainer1
  • CloudBlobDirectory
  • ICloudBlob2ICloudBlob2
  • CloudBlockBlob2CloudBlockBlob2
  • CloudPageBlob2CloudPageBlob2
  • CloudAppendBlob2CloudAppendBlob2

1 Требует привязки in direction в файле function.json или FileAccess.Read в библиотеке классов C#.1 Requires "in" binding direction in function.json or FileAccess.Read in a C# class library. Однако вы можете использовать объект контейнера, предоставляемый средой выполнения для записи таких операций, как отправка больших двоичных объектов в контейнер.However, you can use the container object that the runtime provides to do write operations, such as uploading blobs to the container.

2 Требует привязки inout direction в файле function.json или FileAccess.ReadWrite в библиотеке классов C#.2 Requires "inout" binding direction in function.json or FileAccess.ReadWrite in a C# class library.

Если при попытке привязаться к одному из типов SDK для службы хранилища получено сообщение об ошибке, убедитесь, что у вас есть ссылка на правильную версию пакета SDK для службы хранилища.If you try to bind to one of the Storage SDK types and get an error message, make sure that you have a reference to the correct Storage SDK version.

В асинхронных функциях используйте возвращаемое значение или IAsyncCollector вместо параметра out.In async functions, use the return value or IAsyncCollector instead of an out parameter.

Привязку к string или Byte[] рекомендуется использовать, только если большой двоичный объект имеет небольшой размер, так как в память загружается все содержимое большого двоичного объекта.Binding to string or Byte[] is only recommended if the blob size is small, as the entire blob contents are loaded into memory. Как правило, предпочтительнее использовать тип Stream или CloudBlockBlob.Generally, it is preferable to use a Stream or CloudBlockBlob type. Дополнительные сведения см. в разделе о параллелизме и использовании памяти выше в этой статье.For more information, see Concurrency and memory usage earlier in this article.

Исключения и коды возвратаExceptions and return codes

ПривязкаBinding Справочные материалыReference
BLOB-объектыBlob Коды ошибок больших двоичных объектовBlob Error Codes
Большой двоичный объект, таблица, очередьBlob, Table, Queue Коды ошибок хранилищаStorage Error Codes
Большой двоичный объект, таблица, очередьBlob, Table, Queue Устранение неполадокTroubleshooting

Дальнейшие действияNext steps