Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core .net核心**永不调用**”;下一步。在响应发送到客户端后调用;那么,如何实现符合良好实践的代码呢?_Asp.net Core_Asynchronous_.net Core_Delegates_Func - Fatal编程技术网

Asp.net core .net核心**永不调用**”;下一步。在响应发送到客户端后调用;那么,如何实现符合良好实践的代码呢?

Asp.net core .net核心**永不调用**”;下一步。在响应发送到客户端后调用;那么,如何实现符合良好实践的代码呢?,asp.net-core,asynchronous,.net-core,delegates,func,Asp.net Core,Asynchronous,.net Core,Delegates,Func,我对.NETCore有点陌生,所以如果我听起来很天真,请原谅我 (参考资料:) 警告 不要调用next。在响应发送到客户端后调用。 响应开始后对HttpResponse的更改引发 例外。例如,设置标题和状态代码会引发 例外。调用下一步后写入响应正文: 可能导致违反协议。例如,写得比 规定的内容长度。 可能会损坏正文格式。例如,将HTML页脚写入CSS文件 HasStarted是一个有用的提示,用于指示头是否已发送或删除 尸体已经写给我了 根据上面的Microsoft文档,以下是糟糕的编程实践。但

我对.NETCore有点陌生,所以如果我听起来很天真,请原谅我

(参考资料:)

警告

不要调用next。在响应发送到客户端后调用。 响应开始后对HttpResponse的更改引发 例外。例如,设置标题和状态代码会引发 例外。调用下一步后写入响应正文:

可能导致违反协议。例如,写得比 规定的内容长度。 可能会损坏正文格式。例如,将HTML页脚写入CSS文件

HasStarted是一个有用的提示,用于指示头是否已发送或删除 尸体已经写给我了

根据上面的Microsoft文档,以下是糟糕的编程实践。但是,假设我希望网页向应用程序的网页用户指示已执行中间件组件(这意味着写入响应)

app.Use(异步(上下文,下一步)=>
{
wait context.Response.WriteAsync(“来自中间件1的Hello World”);
等待next.Invoke();
});
应用程序使用(异步(上下文,下一步)=>
{
wait context.Response.WriteAsync(“来自中间件2的Hello World”);
等待next.Invoke();
});

由于上面的Microsoft技术文档中规定永远不要调用“在响应发送到客户端后调用next.Invoke”,那么有人能告诉我如何实现同样的代码吗,但是仍然是一个好的实践?

关键是应该只有一个中间件负责生成响应。如果多个中间件彼此互锁,则表明它应该是单个中间件

例如,MVC中间件本身有点像这样:使用MVC过滤器,有多个参与者可以产生结果。为了克服这个问题,MVC有自己的管道,它不会直接写入响应,而是收集一个中间结果,该结果只会在最后写入响应。这就是
IActionResult
抽象所做的:当过滤器运行时,它们可以修改操作结果,并且只有在MVC管道的末端(也就是MVC中间件的末端),才会执行结果


如果您只需要在中间件之间传输信息,那么使用响应无论如何都是一个坏主意,因为以后的中间件无法读取该信息。因此,最好将信息存储在别处。HttpContext是一个很好的地方。是一种简单的存储器,用于在请求期间保存您可以使用的信息。要获得更详细的信息,您还可以使用可以注册到的“功能”。例如,功能与端点路由一起使用,以允许其他中间件访问当前请求的路由信息(例如,允许授权中间件为特定端点授权用户)。有关项目和功能的更多详细信息,请查看。

关键是应该只有一个中间件负责生成响应。如果多个中间件彼此互锁,则表明它应该是单个中间件

例如,MVC中间件本身有点像这样:使用MVC过滤器,有多个参与者可以产生结果。为了克服这个问题,MVC有自己的管道,它不会直接写入响应,而是收集一个中间结果,该结果只会在最后写入响应。这就是
IActionResult
抽象所做的:当过滤器运行时,它们可以修改操作结果,并且只有在MVC管道的末端(也就是MVC中间件的末端),才会执行结果

如果您只需要在中间件之间传输信息,那么使用响应无论如何都是一个坏主意,因为以后的中间件无法读取该信息。因此,最好将信息存储在别处。HttpContext是一个很好的地方。是一种简单的存储器,用于在请求期间保存您可以使用的信息。要获得更详细的信息,您还可以使用可以注册到的“功能”。例如,功能与端点路由一起使用,以允许其他中间件访问当前请求的路由信息(例如,允许授权中间件为特定端点授权用户)。有关项目和功能的更多详细信息,请查看

       app.Use(async (context, next) =>
        {
            await context.Response.WriteAsync("<div> Hello World from the middleware 1 </div>");
            await next.Invoke();
        });


        app.Use(async (context, next) =>
        {
            await context.Response.WriteAsync("<div> Hello World from the middleware 2 </div>");
            await next.Invoke();
        });