Asp.Net Core中间件路径字符串startswithsegments问题

Los*_*les 5 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("/")
);
Run Code Online (Sandbox Code Playgroud)

不使用MapWhen(),而仅对app.UseStatusCodePagesWithReExecute("/")所有不是root的路径使用。只想为不是root和not的所有路径添加过滤/api。有关如何执行此操作的任何想法?

Cod*_*ler 9

分支管道在这里无法正常工作,因为您没有在状态代码页中间件之后添加 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();
}
Run Code Online (Sandbox Code Playgroud)

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

然而,使用条件管道在这里似乎有点矫枉过正。您可以使用URL 重写中间件来实现您的目标:

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

app.UseMvc();
Run Code Online (Sandbox Code Playgroud)