如果路径以“/api”开头并且有一个文件映射为回退,如何 return 404?
How to return 404 if path starts with '/api' and there is a file mapped as fallback?
我有一个 asp.net 核心 6.0 应用程序:
WeatherForecastController
index.html
在 wwwroot
文件夹中。
我已将 index.html
配置为文件后备。这是program.cs
的main
方法;
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
导航到任何地方
这就是您要实现的目标吗?
我有一个 asp.net 核心 6.0 应用程序:
WeatherForecastController
index.html
在wwwroot
文件夹中。
我已将 index.html
配置为文件后备。这是program.cs
的main
方法;
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
导航到任何地方这就是您要实现的目标吗?