在web api IExceptionHandler中获取请求正文

时间:2015-10-30 04:43:41

标签: asp.net asp.net-web-api asp.net-web-api2 owin

我正在尝试为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());

1 个答案:

答案 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()