Роль привязок в Azure Functions

Tags: Azure, CosmosDB, Microsoft

Что такое привязки?

В Azure Functions привязки ввода и вывода используются как способ подключения ресурсов к функциям, а данные из Привязок передаются как параметры.
При выполнении функции, привязки для вывода - ресурсы, которые записываются в вывод функции.  Для дальнейшего использования нужно определить атрибут привязки для ввода к методу функции.

Как привязки работают в функциях библиотеки класса?

В функциях библиотеки класса привязки настраиваются с помощью декоратора методов и параметров функций, используя атрибуты  С#, например:

[FunctionName(nameof("FunctionName"))]
public async Task Run([EventGridTrigger] EventGridEvent[] eventGridEvents,
[EventGrid(TopicEndpointUri = "TopicEndpoint", TopicKeySetting = "TopicKey")] IAsyncCollector<EventGridEvent> outputEvents,
ILogger logger)
{
    // Function code
}

В коде выше есть функция, которая запускается сеткой событий и использует привязку ввода сетки событий для публикации событий. Входящее событие привязывается к массиву EventGridEvents, а выходящее публикуется в IAsyncCollector типов EventGridEvent. Тип параметра определяет тип данных для входных данных в эту функцию.

Чем привязки отличаются в изолированных функциях процесса?

Как и функции библиотеки классов привязка определяется с помощью атрибута в параметрах, методах и возвращаемых типах.

Привязки в изолированном проекте .net отличаются тем, что не могут использовать классы привязки, такие как IAsyncCollector<T>. Также нельзя использовать типы, унаследованные от SDK, например DocumentClient. Вместо этого приходится полагаться на строки, массивы и POCO (Plain Old Class Objects).

Проиллюстрируем это примером. Создана функция, которая получает HTTP POST-запрос и передает документ на хранение   в Cosmos DB.

Вот код функции:

using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
 
namespace IsolatedBindings
{
    public static class InsertTodo
    {
        [Function("InsertTodo")]
        [CosmosDBOutput("%DatabaseName%", "%ContainerName%", ConnectionStringSetting = "CosmosDBConnectionString")]
        public static async Task<object> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req,            
            FunctionContext executionContext)
        {
            HttpResponseData response;
            var logger = executionContext.GetLogger("InsertTodo");
            logger.LogInformation("C# HTTP trigger function processed a request.");
 
            try
            {
                var request = await new StreamReader(req.Body).ReadToEndAsync();
 
                var todo = JsonConvert.DeserializeObject<TodoItem>(request);
                todo.Id = Guid.NewGuid().ToString();
 
                return todo;
            }
            catch (Exception ex)
            {
                logger.LogError($"Exception thrown: {ex.Message}");
                response = req.CreateResponse(HttpStatusCode.InternalServerError);
            }
 
            return response;
        }
    }
}

Эта функция использует привязку для вывода Azure Cosmos DB. К методу функции, который определяет, как записывается POST-запрос в службе Cosmos DB, применяется атрибут привязки. Для того чтобы использовать привязку CosmosDBOutput, необходимо установить следующий пакет:

Microsoft.Azure.Functions.Worker.Extensions.CosmosDB

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

С полным списком можно ознакомиться по ссылке: 

https://www.nuget.org/packages?q=Microsoft.Azure.Functions.Worker.Extensions

В функциях библиотек классов привязка была бы определена для вывода в атрибуте метода, где определили бы тип вывода и записали выводную функцию в это привязку таким образом.

В изолированных функциях значение, возвращаемое нашим методом - это значение, которое будет записано в привязку  Cosmos DB Output. Таким образом, в функции создается POST-запрос, содержащий элемент Todo, который необходимо записать  Cosmos DB и когда он будет возвращен из функции, то будет записан в Cosmos DB.

Проверим это! Используем Postman для создания следующего запроса:

После запуска функции должна быть получена локальная конечная точка для отправки POST-запроса, например так:

http://localhost:7071/api/InsertTodo

При создании POST-запроса на эту конечную точку получаем следующий ответ:

Зайдем в учетную запись Cosmos DB и проверим, что документ был успешно записан в:

No Comments

Add a Comment