Как правильно вернуть коды состояния / ошибки из функции Azure, которая была вызвана событием таблицы событий - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь понять, как управлять контролируемыми и неконтролируемыми результатами / сбоями в 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?

1 Ответ

1 голос
/ 07 апреля 2020

К Q1:

В настоящее время версия функции EventGridTrigger не имеет указанного объекта исключения c для обработки ее оболочкой значения HttpStatusCode. Другими словами, любое исключение в функции azure вызовет повторную попытку, когда она включена.

В качестве обходного пути для этой проблемы мы можем использовать функцию HttpTrigger для обработчика подписчика с возвращаемым значением HttpStatusCode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...