Чтение тела ответа в промежуточном программном обеспечении - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь получить копию ответа после выполнения моего действия контроллера MVC, но из других вопросов здесь я не могу заставить этот код работать (хотя это, казалось, было хорошо решенной проблемой) ...

public class Startup
{
   public void Configuration(IAppBuilder app)
   {
     app.Use(async (context, next) =>
     {
        var resultStream = context.Response.Body;
        context.Response.Body = new MemoryStream();

        // allow the response to be written in future request lifecycle events
        await next.Invoke();

        // fetch the repsonse
        context.Response.Body.Seek(0, SeekOrigin.Begin);
        var headers = context.Response.Headers;
        var body = new StreamReader(context.Response.Body).ReadToEnd();

        // ... other code omitted for question clarity

        // write the response to the client
        context.Response.Body.Seek(0, SeekOrigin.Begin);
        await context.Response.Body.CopyToAsync(resultStream);
        context.Response.Body = resultStream;
      });
   }

   // ... other code omitted for question clarity
}

Когда я перехожу ко второму запросу, переменная "body" пуста.

Есть идеи, почему это может быть в случае, когда результатом после этой страницы является страница с контентом?

1 Ответ

0 голосов
/ 03 июня 2018

Таким образом, выясняется, что проблема здесь в том, что Owin и asp.net не переплетаются в полном жизненном цикле вместе, как я думал.

Короче говоря, жизненный цикл запроса выглядит примерно так:...

  1. Делать вещи Owin (все промежуточные программы owin)
  2. Делать вещи MVC
  3. Делать вещи сервера

...что мне нужно ...

  1. Делать вещи
  2. Делать вещи MVC
  3. Делать вещи Owin
  4. Работать на сервере

... конечно, я сильно упрощаю этот процесс, но я думаю, что короткий способ объяснить это, когда вы делаете ...

app.Use((context, next) => { ... }).UsestageMarker(?);

... естьнет отметки этапа для «обработки ответа завершено».

Интересно, что ядро ​​aspnet дает нам гораздо больший контроль, поскольку тесная интеграция со всеми компонентами на протяжении жизненного цикла запроса в меньшей степени зависит от предварительно определенных этапов и больше зависит от вас, пользователь, определяющий вашсобственный процесс обработки запросов и построения ответа.

Короче ... в ядре aspnet я могу делать то, что пытаюсь сделать, но это не представляется возможным в связи с .net 4.6

Однако я сделал несколько ссылокк использованию фильтров и обработке «OnActionExectuted», которое, если вы посмотрите, у вас будет совершенно другой объект Запроса и Ответа, чем те, которые были переданы вам конвейером промежуточного программного обеспечения owin (таким образом, добавив больше доказательств того, что эти вещи на самом деле не один процесс, а просто два, которые происходятв порядке).

С тех пор я потратил время на то, чтобы перенести мое приложение в ядро ​​aspnet ... что оказалось головной болью больше, чем я ожидал, но я всегда надеюсь наконечный результат будет чище и быстрее.

...