Owin管道分支在遇到第一阶段标记时运行所有中间件

时间:2015-10-14 17:00:34

标签: asp.net iis owin katana

创建(无分支)OWIN管道时,会尊重舞台标记。

但是当使用分支管道(app.Mapapp.MapWhen)时,每个分支中的所有中间件都会在遇到第一个阶段标记的阶段运行。

有没有办法在分支内使用舞台标记?

为了说明我使用Katana branching pipeline demo

的修改版本的问题
public void Configuration(IAppBuilder app)
{
    app.Use<AddBreadCrumbMiddleware>("start-of-the-line");

    app.Map("/branch1", app1 =>
    {
        app1.Use<AddBreadCrumbMiddleware>("took-branch1");
        app1.Use<AddBreadCrumbMiddleware>("more-in-branch1");

        // Nesting paths, e.g. /branch1/branch2
        app1.Map("/branch2", app2 =>
        {
            app2.Use<AddBreadCrumbMiddleware>("took-branch2");
            app2.Use<DisplayBreadCrumbs>();
        });

        app1.Use<DisplayBreadCrumbs>();
    });

对于路径:/branch1/branch2,这会输出预期结果:

  

行开始(阶段:PreHandlerExecute),take-branch1(阶段:PreHandlerExecute),more-in-branch1(阶段:PreHandlerExecute),take-branch2(阶段:PreHandlerExecute)

现在我添加一些舞台标记:

    app.Map("/branch1", app1 =>
    {
        app1.Use<AddBreadCrumbMiddleware>("took-branch1");
        app1.UseStageMarker(PipelineStage.Authenticate);

        app1.Use<AddBreadCrumbMiddleware>("more-in-branch1");
        app1.UseStageMarker(PipelineStage.Authorize);

        // Nesting paths, e.g. /branch1/branch2
        app1.Map("/branch2", app2 =>
        {
            app2.Use<AddBreadCrumbMiddleware>("took-branch2");
            app2.UseStageMarker(PipelineStage.PostResolveCache);
            app2.Use<DisplayBreadCrumbs>();
        });

        app1.Use<DisplayBreadCrumbs>();
    });

这次相同路径的输出是:

  

开始行(阶段:Authenticate),take-branch1(阶段:Authenticate),more-in-branch1(阶段:Authenticate),take-branch2(阶段:Authenticate)

有人可以解释为什么一切都在Authenticate阶段运行,是否有解决方法来尊重分支中的其他阶段标记?

1 个答案:

答案 0 :(得分:0)

将评论显示为答案:

  

通过设计。阶段标记仅在根管道中受支持。否则,您可能会错过分支。 – Tratcher '15 Oct 20在1:19

是的,正如问题所指出的,“当使用分支管道(带有app.Mapapp.MapWhen时),每个分支中的所有中间件都在遇到的第一个阶段标记的阶段运行。”

在这种情况下,使用SignalR的注意事项:在调用SignalR OWIN扩展程序之一(例如MapSignalRRunSignalR)时,那些扩展程序会明确设置阶段标记,以避免进行会话状态:

// We need to make that SignalR runs before any handlers are
// mapped in the IIS pipeline so that we avoid side effects like
// session being enabled. [...]
builder.UseStageMarker(PipelineStage.PostAuthorize);

https://github.com/SignalR/SignalR/blob/2.4.1/src/Microsoft.AspNet.SignalR.Core/Owin/OwinExtensions.cs#L246

这意味着,如果您在OWIN应用中配置SignalR,则_all_请求(包括非信号请求)将在同一阶段运行,而无需HttpContext.Current.SessionHttpContext.Current.CurrentHandler