Роль привязок в Azure Functions
Что такое привязки?
В 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 и проверим, что документ был успешно записан в: