我正在尝试为ASP.NET web api编写一个全局错误处理程序,它能够记录在我的api中导致未处理异常的请求的请求详细信息。我在我的OWIN启动类中注册了以下GlobalExceptionHandler类,但是我无法检索请求体中发布的任何数据的内容。
public class GlobalExecptionHander : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
var body = context.Request.Content.ReadAsStringAsync().Result;
//body here is an empty string
context.Result = new UnhandledErrorActionResult
{
Request = context.Request,
};
}
}
在我的启动课程中
config.Services.Replace(typeof(IExceptionHandler), new GlobalExecptionHander());
答案 0 :(得分:0)
由于我刚遇到这个确切的问题,我很惊讶地发现这个问题没有答案!希望您在所有这些时间之后都能解决问题。无论如何,我仍然想回答这个问题。
问题是,当您的GlobalExceptionHandler
处理异常时,某些内容(例如Newtonsoft Json或任何其他请求处理程序)已经读取了HTTP请求的内容流。读取流后,您将无法再次读取它,除非有某种方法可以将该流重置为其初始位置...
public override void Handle(ExceptionHandlerContext context)
{
string requestContent = "";
using(System.IO.Stream stream = context.Request.Content.ReadAsStreamAsync().Result)
{
// Set the stream back to position 0...
if (stream.CanSeek)
{
stream.Position = 0;
}
// ... and read the content once again!
requestContent = context.Request.Content.ReadAsStringAsync().Result;
}
/* ..Rest of code handling the Exception.. */
}
requestContent
在该using
块之外的原因是,在该块关闭之后流被丢弃了。阅读完内容后,您还可以摆脱using
并致电stream.Dispose()
。