创建(无分支)OWIN管道时,会尊重舞台标记。
但是当使用分支管道(app.Map
或app.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
阶段运行,是否有解决方法来尊重分支中的其他阶段标记?
答案 0 :(得分:0)
将评论显示为答案:
通过设计。阶段标记仅在根管道中受支持。否则,您可能会错过分支。 – Tratcher '15 Oct 20在1:19
是的,正如问题所指出的,“当使用分支管道(带有app.Map
或app.MapWhen
时),每个分支中的所有中间件都在遇到的第一个阶段标记的阶段运行。” >
在这种情况下,使用SignalR的注意事项:在调用SignalR OWIN扩展程序之一(例如MapSignalR
或RunSignalR
)时,那些扩展程序会明确设置阶段标记,以避免进行会话状态:
// 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);
这意味着,如果您在OWIN应用中配置SignalR,则_all_请求(包括非信号请求)将在同一阶段运行,而无需HttpContext.Current.Session
或HttpContext.Current.CurrentHandler
。