Кажется. NET Ядро 3.1 очень затрудняет доступ к телу необработанного HTTP-запроса после исключения
Суть проблемы заключается в том, что вы не можете перемотать поток в начало, поэтому все это можно прочитать
В приведенном ниже примере вывод:
Content-Length: 19
Can't rewind body stream. Specified method is not supported.
Body:
Если я удаляю поиск, нет никаких исключений, но, конечно, тело возвращается в виде пустой строки потому что он уже был обработан
Существует несколько новых трубопроводов, основанных на API-интерфейсе Pipeline с использованием 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();
});
}