【问题标题】:Reading the response body in owin middleware在 owin 中间件中读取响应体
【发布时间】:2018-06-02 13:04:59
【问题描述】:

在我的 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”为空。

任何想法为什么在此之后的结果是包含内容的页面时可能会出现这种情况?

【问题讨论】:

  • UseMvc() 是否会立即跟随您的中间件 .Use() 调用?
  • 这看起来像是 ASP.NET Core 中间件,而不是 OWIN 中间件。
  • @RudiVisser 它没有,这也不是 .Net 核心,它是 .Net 4.6
  • @War 那么next 不是指您的控制器执行,这是唯一可行的方法吗?编辑:FullFx 与否我认为方法是相似的。您管道中的下一个中间件是什么?它必须是 MVC 中间件,否则您将无法获得控制器的结果。 EDIT2:实际上可能不是,因为您将等待整个管道完成.. 嗯
  • 我不知道 next 指的是什么...... owin 是一个复杂的管道.. 但我的理解是,如果你调用并 await next 那么你调用整个管道而不仅仅是下一个中间件项在管线中。我看到我的控制器操作在 await next 和第一次 seek 调用之间被击中。

标签: c# asp.net-mvc httpresponse owin-middleware


【解决方案1】:

所以事实证明这里的问题在于 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 核心……这比我预期的更令人头疼,但我一直希望最终结果更干净、更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-13
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多