gpt4 book ai didi

c# - 在owin中间件中读取响应体

转载 作者:太空宇宙 更新时间:2023-11-03 14:53:34 25 4
gpt4 key购买 nike

我试图在我的 MVC Controller 操作执行后获取响应的副本,但是从这里的其他问题我无法让这段代码工作(即使这似乎是一个很好回答的问题)......

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

当此后的结果是一个包含内容的页面时,您是否知道为什么会出现这种情况?

最佳答案

所以这里的问题是因为 Owin 和 asp.net 没有像我想象的那样在整个生命周期中交织在一起。

简而言之,请求生命周期看起来像......

  1. 做 Owin 的东西(所有 owin 中间件)
  2. 做 MVC 的事情
  3. 做服务器的事情

...我需要的是...

  1. 做自己的事
  2. 做 MVC 的事情
  3. 做更多欧文的事情
  4. 做服务器的事情

...当然,我在这里过度简化了过程,但我想解释它的最简单方法是当您...

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

...“响应处理完成”没有阶段标记。

有趣的是,aspnet core 为我们提供了更多的控制权,因为在整个请求生命周期中与所有部分的紧密集成较少地依赖于预定义的阶段,而更多地依赖于用户定义自己的过程来处理请求和构建响应。

简而言之...在 aspnet 核心中,我可以做我想做的事,但这在使用 .net 4.6 的 owin 中似乎不可能

但是我做了一些关于使用过滤器和处理“OnActionExectuted”的引用,如果你看起来你有一个与 owin 中间件管道给你的完全不同的请求和响应对象(因此添加更多证据表明这些东西不在事实上,只有一个过程,但只是按顺序发生的两个过程。

从那以后,我一直在研究如何将我的应用程序迁移到 aspnet 核心......事实证明这比我预期的更令人头疼,但我一直希望最终结果更干净、更快。

关于c# - 在owin中间件中读取响应体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50657219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com