Asp.Net Core中间件pathstring开始于分段问题

时间:2018-04-06 12:34:00

标签: asp.net-core asp.net-core-2.0

有一个Asp.NET Core 2.0应用程序,我想映射任何不以/api开头的路径,只是重新执行到根路径。我添加了以下内容,但似乎无法正常工作:

app.MapWhen(
   c => !c.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase),
   a => a.UseStatusCodePagesWithReExecute("/")
);

不使用MapWhen(),只使用app.UseStatusCodePagesWithReExecute("/")适用于非root的所有路径。只想为所有非根路径而不是/api添加过滤。关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:3)

分支管道在此处无法正常工作,因为您尚未在状态代码页中间件之后添加MVC中间件。这是正确的管道设置:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.MapWhen(
        c => !c.Request.Path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase),
        a =>
        {
            a.UseStatusCodePagesWithReExecute("/");
            a.UseMvc();
        });

    app.UseMvc();
}

请注意,中间件顺序在这里很重要,您应该在MVC之前添加状态代码页中间件。

然而,使用条件管道似乎有点矫枉过正。您可以使用URL Rewriting Middleware实现目标:

var options = new RewriteOptions()
    .AddRewrite(@"^(?!/api)", "/", skipRemainingRules: true);
app.UseRewriter(options);

app.UseMvc();