Owin舞台标记

War*_*War 5 c# pipeline owin

鉴于这在我的应用程序启动...

app.Use((context, next) =>
{
   return next.Invoke();
}).UseStageMarker(PipelineStage.PostAuthenticate);


app.Use((context, next) =>
{
   return next.Invoke();
}).UseStageMarker(PipelineStage.Authenticate);
Run Code Online (Sandbox Code Playgroud)

...为什么PostAuthenticate代码在Authenticate代码之前执行?

我并不是说"为什么第一个app.use在第二个app.use之前被调用"我的意思是:为什么第一个调用会在第二个调用之前被调用,因为第二个应该在请求管道中更早发生?

编辑

与此问题相关:如何在此代码中获取Windows标识?

Vya*_*kin 6

这是设计,根据文档:https://www.asp.net/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline.

阶段标记规则部分,您可以阅读以下内容:

OWIN管道和IIS管道是有序的,因此app.UseStageMarker必须按顺序调用.您不能将事件处理程序设置为在使用to注册的最后一个事件之前的事件app.UseStageMarker.例如,致电之后:

app.UseStageMarker(PipelineStage.Authorize);
Run Code Online (Sandbox Code Playgroud)

调用app.UseStageMarker传递AuthenticatePostAuthenticate不会被尊重,并且不会抛出任何异常.Owin中间件组件(OMC)在最新阶段运行,默认情况下是PreHandlerExecute.舞台标记用于使它们更早运行.如果您不按顺序指定阶段标记,我们将舍入到较早的标记.换句话说,添加一个舞台标记说"不晚于第十阶段运行".OMC在OWIN管道中添加了最早的阶段标记.