在我的app启动中给出了这个...
app.Use((context, next) =>
{
return next.Invoke();
}).UseStageMarker(PipelineStage.PostAuthenticate);
app.Use((context, next) =>
{
return next.Invoke();
}).UseStageMarker(PipelineStage.Authenticate);
...为什么PostAuthenticate代码在Authenticate代码之前执行?
我不是说“为什么第一个app.use在第二个app.use之前被调用”我的意思是:为什么第一个调用会在第二个调用之前被调用,因为第二个调用应该在请求中更早发生管道
修改
答案 0 :(得分:6)
根据文档设计,https://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline。
在阶段标记规则部分中,您可以阅读以下内容:
OWIN管道和IIS管道是有序的,因此必须按顺序调用
app.UseStageMarker
。您无法将事件处理程序设置为在注册到app.UseStageMarker
的最后一个事件之前的事件。例如,在之后调用:app.UseStageMarker(PipelineStage.Authorize);
通过
app.UseStageMarker
或Authenticate
的{{1}}来电不会受到尊重,也不会抛出异常。 Owin中间件组件(OMC)在最新阶段运行,默认情况下为PostAuthenticate
。舞台标记用于使它们更早运行。如果您不按顺序指定阶段标记,我们将舍入到较早的标记。换句话说,添加一个阶段标记说“不晚于阶段X运行”。 OMC在OWIN管道中添加了最早的阶段标记。
答案 1 :(得分:0)
似乎与IIS中的文档事件相反,它们按照配置顺序进行连接和处理,而不是按照它们在请求生命周期中出现的顺序进行处理。
这感觉就像是owin请求生命周期中的一个错误但是嘿,我解决了我的问题。