当URL以/
(例如www.abc.com/hubbahubba/
)终止时,我想引发HTTP404 Not Found。我不知道应该在路由中定义它还是应该由中间件完成?
我正在考虑这样做:
routes.MapRoute( _
name:="CatchTrailingSlash",
url:="*+/",
defaults:=New With {.controller = "Error", .action = "Handler"}
)
但这意味着我需要为其创建专用的控制器。正确的方法是什么?
答案 0 :(得分:1)
您可以使用中间件:
app.Use(async (context, next) =>
{
if (context.Request.GetDisplayUrl().EndsWith("/"))
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
return;
}
await next.Invoke();
});
或使用动作过滤器:
using Microsoft.AspNetCore.Http.Extensions;
public class GlobalFilter: IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
var result = context.HttpContext.Request.GetDisplayUrl().EndsWith("/");
if (result)
{
context.Result = new NotFoundResult();
return;
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
}
全局注册:
services.AddMvc(config =>
{
config.Filters.Add(new GlobalFilter());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);