如何在 URL 中的某些后缀上引发 HTTP404?

How to raise HTTP404 on certain suffix in URL?

当 url 被 / 终止时,我想提出 HTTP404 Not Found 问题,例如 www.abc.com/hubbahubba/。不知道是应该在路由中定义还是应该由中间件来完成?

我正在考虑这样做:

routes.MapRoute( _
      name:="CatchTrailingSlash", 
      url:="*+/", 
      defaults:=New With {.controller = "Error", .action = "Handler"} 
  )

但这意味着我需要为其创建专用控制器。正确的做法是什么?

您可以使用中间件:

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);