我有以下要求:
/controllerName/actionName
路径调用该动作。DefaultController
和Index
操作。/nonExistingController/nonExistingAction
,则应调用DefaultController
和Index
操作。换句话说,与catch-all routing相比,我需要进行部分捕获路由。
我应该如何定义路由?
答案 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();
}