HTTP触发器在Azure Functions v2中不返回stacktrace

时间:2019-01-14 17:40:45

标签: c# azure azure-functions

请考虑一个引发异常的简单HTTP触发器。当我通过Postman对该触发器进行调用时,它返回500 Internal Server Error,但主体为空。作为开发人员,我想查看stacktrace,以便快速调试正在发生的事情。

// 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 Functions v1确实显示了堆栈跟踪。

我知道有多种检查日志的方法,例如通过将环境连接到AppInsights。我正在寻找服务器的即时响应。

1 个答案:

答案 0 :(得分:2)

根据设计,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);
        }

在v2中,我们也可以使用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;
        }