Я пытаюсь понять, как управлять контролируемыми и неконтролируемыми результатами / сбоями в Azure Функции, запускаемые событиями таблицы событий. Я уверен, что мне не хватает какого-то фундаментального аспекта, но я не могу понять смысл имеющейся документации Microsoft.
Используя текущие Visual Studio 2019 Azure Шаблоны функций для триггеров Event Grid, мы получаем C# методов, которые выглядят примерно так:
[FunctionName("UserCreated")]
public static void UserCreated([EventGridTrigger]EventGridEvent evt, ILogger log)
{
...
}
Q1. Как правильно вернуть статусы и коды ошибок из этих методов, чтобы событие можно было либо повторить, либо передать в пустой блок данных? Допустим, я хочу вернуть неверный запрос Status 400, потому что пользовательская полезная нагрузка в переданном событии не была высокой. Я пробовал это:
[FunctionName("UserCreated")]
public static async Task<IActionResult> UserCreated([EventGridTrigger]EventGridEvent evt, ILogger log)
{
...
return new BadRequestObjectResult("ouch");
}
..., который просто приводит к этой ошибке при локальном запуске функции:
Cannot bind parameter '$return' to type IActionResult&. Make sure the parameter Type is supported by the binding.
Я не понимаю эту ошибку и понятия не имею как это решить.
Q2. Как правильно отловить исключения и вернуть их упорядоченным образом? Скажем, метод UserCreated, описанный выше, требует, чтобы переданное событие имело несколько пользовательских точек данных, и что один из этих точек данных отсутствует. Например, у нас есть это:
[JsonObject(ItemRequired = Required.Always)]
private class CustomerAndContactIds
{
public int CustomerId { get; set; }
public int ContactId { get; set; }
}
... и когда мы преобразуем некоторые данные о событиях, которые отсутствуют, например, поле ContactID, например:
private static T ExtractCustomPayloadFromEvent<T>(EventGridEvent evt)
{
return JObject.FromObject(evt.Data).ToObject<T>();
}
... мы получаем это в журналах:
System.Private.CoreLib: Exception while executing function: UserCreated. Newtonsoft.Json: Required property 'ContactPersonId' not found in JSON. Path ''.
Тем не менее, все, что мы получаем, например, Почтальон, это:
Exception while executing function: UserCreated
Как правильно сделать это немного более разборчивым для потребителей, которые не в тайне например, Azure поток журнала или Azure Insights?