Триггер HTTP не возвращает трассировку стека в функциях Azure v2 - PullRequest
0 голосов
/ 14 января 2019

Рассмотрим простой триггер HTTP, который выдает исключение. Когда я выполняю вызов этого триггера через Почтальон, он возвращает 500 Internal Server Error, но тело пусто. Как разработчик, я хочу увидеть трассировку стека, чтобы я мог быстро отладить происходящее.

// Azure Functions v2
[FunctionName("HttpTrigger2")]
public static async Task<HttpResponseMessage> HttpTrigger2(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequestMessage req)
{
    throw new System.Exception("I want to be in the response body.");
}

Это выполняется локально. Я еще не проверял это удаленно.

Я считаю, что функции Azure v1 действительно показали трассировку стека.

Я знаю, что существуют различные способы проверки журналов, например, подключив среду к AppInsights. Что я ищу немедленного ответа от сервера.

1 Ответ

0 голосов
/ 15 января 2019

Должно быть, по замыслу, функция v2 больше не возвращает трассировку стека, как v1. А на удаленном сайте Azure ни функция v1, ни v2 не возвращает трассировку стека. Дизайн разумный, трассировка стека используется для отладки, а тело ответа, очевидно, нет. Когда в качестве ответа возвращается трассировка стека, мы, похоже, раскрываем длинную, а иногда и личную информацию.

Если мы хотим получить исключения как ответ для удобства при локальной отладке, перехватим исключение и вернем его как ответ.

Для работы с HttpRequestMessage

        try
        {
            throw new System.Exception("I want to be in the response body.");
        }
        catch (Exception exception)
        {
            log.LogError(exception, exception.Message);
            return req.CreateResponse(HttpStatusCode.InternalServerError, exception);
        }

В версии 2 мы также можем использовать HttpRequest, а тип ответа должен быть IActionResult.

        try
        {
            throw new System.Exception("I want to be in the response body.");
        }
        catch(Exception exception)
        {
            log.LogError(exception, exception.Message);
            var res = new ObjectResult(exception)
            {
                StatusCode = StatusCodes.Status500InternalServerError
            };
            return res;
        }
...