Owin舞台标记
鉴于这在我的应用程序启动…
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之前被调用”我的意思是:为什么第一个调用会在第二个调用之前调用,因为第二个应该在请求管道中更早发生?
编辑
与此问题相关: 如何在此代码中获取Windows标识?
它是按照设计,根据文档: 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
或PostAuthenticate
将不受尊重,并且不会抛出任何exception。 Owin中间件组件(OMC)在最新阶段运行,默认情况下为PreHandlerExecute
。 舞台标记用于使它们更早运行。 如果您不按顺序指定阶段标记,我们将舍入到较早的标记。 换句话说,添加一个舞台标记说“不晚于第十阶段运行”。 OMC在OWIN管道中添加了最早的阶段标记。
似乎与IIS中的文档事件相反,它们按照它们的配置顺序被连接和处理,而不是按照它们应该出现在请求生命周期中的顺序。
这感觉就像是owin请求生命周期中的一个错误,但是嘿,我的问题解决了。