c# - 用于捕获所有未知路由的核心 API 控制器
问题描述
我有一个带有一堆现有控制器的 Core 2.2 API。我现在要做的是添加一个新控制器,它的作用类似于一个包罗万象的路由,但仅适用于该控制器(并且不会干扰现有控制器的路由)。
在我现有的控制器中,我将路由定义为控制器属性
[Route("api/[controller]")]
[ApiController]
public class SandboxController : ControllerBase
{
[HttpGet("Hello")]
public IEnumerable<string> Hello()
{
return new string[] { "Hello World", TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")).ToString()};
}
}
对于这个新的“catchall”控制器,我需要它能够捕获路由到它的任何 Get、Post、Put、Delete。例如,这个控制器路由是 ../ api/catchall。如果有人在哪里发帖到 ../api/catchall/ some/random/unknown/route我试图抓住这个并将其路由到 ../api/catchall/ post。
到目前为止,我完全不成功。这是我到目前为止得到的:
在我的 Startup.cs
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
...
app.UseMvc(routes =>
{
routes.MapRoute("default", "{controller=Sandbox}/{action=Hello}/{id?}");
routes.MapRoute(
name: "catchall",
template: "{controller}/{*.}",
defaults: new { controller = "catchall", action = "post" });
});
和包罗万象的控制器:
[Route("api/[controller]")]
[ApiController]
public class CatchallController : ControllerBase
{
[HttpPost("post", Order = int.MaxValue)]
public IActionResult Post([FromBody] string value)
{
return Content("{ \"name\":\"John Doe\", \"age\":31, \"city\":\"New York\" }", "application/json");
}
}
关于如何让它发挥作用的任何想法?
解决方案
*
使用or**
语法指定捕获所有路由。放置[Route("{**catchall}")]
在您想成为包罗万象的动作上。这将为所有以控制器路由属性中指定的前缀为前缀的路由创建一条捕获所有路由。
[Route("api/[controller]")]
[ApiController]
public class CatchallController : ControllerBase
{
[Route("{**catchAll}")]
[HttpPost("post", Order = int.MaxValue)]
public IActionResult Post([FromBody] string value, string catchAll)
{
return Content("{ \"name\":\"John Doe\", \"age\":31, \"city\":\"New York\" }", "application/json");
}
}
在上面的示例中,这将捕获api/catchall/anything/following/it
并将字符串 catchAll 设置为anything/following/it
如果您想设置站点范围内的所有路由,您可以使用绝对 url
[Route("/{**catchAll}")]
public IActionResult CatchAll(string catchAll)
{
}
这将捕获与任何其他指定路线不匹配的任何路线。
推荐阅读
- regex - 当 url 以斜杠结尾时,apache 重写规则无法正常工作
- google-apps-script - 有条件地更改 Google 日历活动的颜色
- python - 将元图转换为 .pb 时出现异常
- reactjs - Redux 和 Typescript 中间件
- regex - 使用 mac 终端删除文件
- mysql - 组查询不支持 mysql 8;
- sql - SQL查询“折叠”靠近在一起的行
- python - 如何为 PrimeFaces 编写 Python 硒测试?
- javascript - 通过 cors 将 base64 图像插入 MySQL 数据库的最佳方法是什么?(MySQL+Express+React+Node 栈)
- python - Python3:使用 Dateutil 从长字符串中创建多个变量