gpt4 book ai didi

asp.net - 在 Web api IExceptionHandler 中获取请求正文

转载 作者:行者123 更新时间:2023-12-01 06:10:19 26 4
gpt4 key购买 nike

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

最佳答案

由于我刚刚遇到这个确切的问题,我很惊讶地发现这个问题没有答案!我希望你在这么长时间后设法解决了这个问题。无论如何,我还是想回答这个问题。

问题是到时候你的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()阅读完内容后。

关于asp.net - 在 Web api IExceptionHandler 中获取请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33428812/

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