Невозможно получить доступ к содержимому тела HTTP-запроса в обработчике исключений ASP. NET Core 3.1 - PullRequest
0 голосов
/ 12 апреля 2020

Кажется. 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();
        });
    }
...