【发布时间】:2020-08-21 23:26:35
【问题描述】:
似乎 .NET Core 3.1 使得在出现异常后访问原始 HTTP 请求正文变得非常困难
问题的核心似乎是您无法将流倒回到开头,因此可以阅读整个内容
在下面的示例中,输出为:
Content-Length: 19
Can't rewind body stream. Specified method is not supported.
Body:
如果我删除了 Seek,也不例外,但是body当然会作为一个空字符串返回,因为它已经被处理了
有一些基于 Pipeline API 的新管道,涉及 Request.BodyReader,但它们遇到了同样的问题。
出现异常后,我需要做的就是将完整的请求转储到包含正文内容的日志文件中。这应该没那么难吧?
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
Console.WriteLine("Content-Length: " + context.Request.Headers["Content-Length"]);
string tmp;
try
{
context.Request.Body.Seek(0, SeekOrigin.Begin);
}
catch(Exception ex)
{
Console.WriteLine("Can't rewind body stream. " + ex.Message);
}
using (var reader = new StreamReader(context.Request.Body, Encoding.UTF8))
{
tmp = await reader.ReadToEndAsync();
}
Console.WriteLine("Body: " + tmp);
});
});
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapDefaultControllerRoute();
});
}
【问题讨论】:
-
为什么需要在异常时重复读取请求正文。
-
很多用例 - 记录一个。您想知道请求失败时的样子。安全性 - 如果是恶意的,其中可能包含对跟踪等有用的信息。尝试捕获异常内容非常有意义。
标签: asp.net-core-3.1