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

时间:2019-09-04 06:01:48

标签: asp.net-core asp.net-core-2.2

当URL以/(例如www.abc.com/hubbahubba/)终止时,我想引发HTTP404 Not Found。我不知道应该在路由中定义它还是应该由中间件完成?

我正在考虑这样做:

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

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

1 个答案:

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