如果路径以“/api”开头并且有一个文件映射为回退,如何 return 404?

How to return 404 if path starts with '/api' and there is a file mapped as fallback?

我有一个 asp.net 核心 6.0 应用程序:

我已将 index.html 配置为文件后备。这是program.csmain方法;

public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddControllers();
    var app = builder.Build();

    // Configure the HTTP request pipeline.

    app.UseHttpsRedirection();
    app.UseAuthorization();
    app.MapControllers();
    app.UseStaticFiles();
    app.MapFallbackToFile("index.html");
    app.Run();
}

path/api 开头并且没有匹配的控制器操作时,我想 return 404。

我尝试在 app.MapControllers 之后添加一个中间件,但是中间件在调用控制器之前执行,并且应用程序在尝试调用 API.[=25 时总是 returns 404 =]

public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddControllers();
    var app = builder.Build();

    // Configure the HTTP request pipeline.

    app.UseHttpsRedirection();
    app.UseAuthorization();
    app.MapControllers();
    app.UseApiNotFound();
    app.UseStaticFiles();
    app.MapFallbackToFile("index.html");
    app.Run();
}

这是中间件:

public class ApiNotFoundMiddleware
{

    private readonly RequestDelegate next;
    public ApiNotFoundMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    private static PathString prefix = "/api";

    public Task InvokeAsync(HttpContext context)
    {
        if (context.Request.Path.StartsWithSegments(prefix))
        {
            context.Response.StatusCode = (int)HttpStatusCode.NotFound;
            return Task.CompletedTask;
        }
        else
        {
            return this.next(context);
        }
    }
}

所以

如果路径以 '/api' 开头,如何 return 404,没有匹配的控制器操作并且有一个文件映射为回退?

有没有办法将回退文件限制为不以 /api

开头的路径

您可以在 Progam.cs 或 Startup.cs 中针对不同的条件使用不同的 IApplicationBuilder:

例如:

app.MapWhen(ctx => !ctx.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
    appBuilder.UseRouting();
    appBuilder.UseEndpoints(ep =>
    {
        ep.MapFallbackToFile("index.html");
    });
});

如果你像这样在此处添加 app.UseMiddleware<ApiNotFoundMiddleware>(); :

app.UseHttpsRedirection();
app.UseMiddleware<ApiNotFoundMiddleware>();
app.UseAuthorization();

这个 returns 404 如果你尝试使用 /api

导航到任何地方

这就是您要实现的目标吗?