如何将所有404路由重定向到ASP.NET Core MVC中的一项集中动作?

时间:2019-07-13 12:35:19

标签: c# asp.net asp.net-mvc

我有以下要求:

  1. 如果定义了控制器和动作,则应为/controllerName/actionName路径调用该动作。
  2. 如果未指定任何内容,则应调用DefaultControllerIndex操作。
  3. 如果路径为/nonExistingController/nonExistingAction,则应调用DefaultControllerIndex操作。

换句话说,与catch-all routing相比,我需要进行部分捕获路由。

我应该如何定义路由?

2 个答案:

答案 0 :(得分:2)

您可以为此使用自定义中间件

public class NotFoundMiddleware
{
    private readonly RequestDelegate _next;

    public NotFoundMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        // Actual processing code goes here
        context.Response.StatusCode = StatusCodes.Status200OK;
        await context.Response.WriteAsync("Hello, world!");
    }
}

然后在MVC中间件之后的 中在Startup类中注册,以便它处理MVC不提供的所有请求(正是未找到控制器的情况)

app.UseMvc();
app.UseMiddleware<NotFoundMiddleware>();

现在http://localhost:5000/nonExistingController/nonExistingAction给了我们Hello world的答复。

PS 。如果您确实想使用控制器,虽然效率不是很高,但您也可以使用DefaultController从此中间件重定向到Moved Permanently

答案 1 :(得分:0)

您可以使用UseStatusCodePagesWithRedirects扩展, 并且您必须指定其中带有{0}的根,以传递状态代码, 并添加“〜”字符以处理此页面的每个根,

您的代码将如下所示:
在启动中

app.UseStatusCodePagesWithRedirects("~/yourAction/{0}");

和控制器

[Route("yourAction/{id}")]
public IActionResult yourAction(int id)
{
// you will use this code to display a custom page for every error
Response.StatusCode = id;
return View();
}