gpt4 book ai didi

logging - AS.NET WEB API全局异常处理程序无法访问请求内容

转载 作者:行者123 更新时间:2023-12-02 12:09:34 25 4
gpt4 key购买 nike

我正在尝试记录有关导致异常的请求的信息。

我正在尝试读取附加到下面的 ExceptionHandlerContext 的请求内容:-

虽然我可以访问请求对象的其他部分,但其内容始终为空。

到目前为止,它似乎已经在管道中被处理掉了。

有没有办法捕获堆栈中这么远的请求正文?

public class GlobalExceptionHandler : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
var exception = context.Exception;

var test = context.Request.Content.ReadAsByteArrayAsync().Result;

var httpException = exception as HttpException;
if (httpException != null)
{
context.Result = new ErrorResult(context.Request, (HttpStatusCode)httpException.GetHttpCode(), httpException.Message);
return;
}

if (exception is BusinessRuleViolationException)
{
context.Result = new ErrorResult(context.Request, HttpStatusCode.PaymentRequired, exception.Message);
return;
}

context.Result = new ErrorResult(context.Request, HttpStatusCode.InternalServerError, exception.Message);
}
}

最佳答案

对于将来发现此线程的任何人来说,答案非常简单,但隐藏得很好。

首先,这里涉及到性能问题。

在找到更好的解决方案之前,我将采用以下方法。

这里的问题是,当我们在管道中将其记录到异常处理程序中时,Request.Content 属性已被处理。

到目前为止,我发现的唯一解决方法是通过消息处理程序将此属性读入缓冲流。

警告! - 我们正在记住请求的正文。

public class RequestBufferMessageHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
await request.Content.LoadIntoBufferAsync();

return await base.SendAsync(request, cancellationToken);
}
}

注意:您可以使用您希望传输的内容的最大大小重载此方法,因此,如果请求中存在大文件,它不会尝试将其提交到内存中。

我们需要使用 HttpConfiguration 将其注册为消息处理程序,如下所示:-

config.MessageHandlers.Add(new RequestBufferMessageHandler());

现在,当我尝试在 ExceptionLogger 实现中访问请求正文时,我可以访问请求正文:-

public class CustomExceptionLogger : ExceptionLogger
{
private readonly ILog _log;

public CustomExceptionLogger(ILogManager logManager)
{
_log = logManager.GetLog(typeof(CustomExceptionLogger));
}


public override async Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken)
{
var body = await context.Request.Content.ReadAsStringAsync();


var data = new
{

requestUrl = context.Request.RequestUri,
requestQueryString = context.RequestContext.RouteData.Values,
requestMethod = context.Request.Method,
requestBody = body,
exception = context.Exception.Message

};

_log.Error(data);

}


}

关于logging - AS.NET WEB API全局异常处理程序无法访问请求内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37589968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com