gpt4 book ai didi

c# - 核心 API Controller 捕获所有未知路由

转载 作者:行者123 更新时间:2023-12-04 14:40:54 25 4
gpt4 key购买 nike

我有一个带有一堆现有 Controller 的 Core 2.2 API。我现在要做的是添加一个新的 Controller ,它的作用类似于一个通用路由,但仅适用于该 Controller (并且不会干扰现有 Controller 的路由)。

在我现有的 Controller 中,我将路由定义为 Controller 属性

[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” Controller 我需要它能够捕获路由到它的任何 Get、Post、Put、Delete .例如,这个 Controller 路由是 ../ api/catchall .如果有人在哪里发帖到../api/catchall/ 一些/随机/未知/路线我试图捕获这个并将其路由到 ../api/catchall/ 发帖 .

到目前为止,我完全没有成功。这是我到目前为止得到的:

在我的 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" });
});

和 catchall Controller :
[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");
}
}

关于如何让它发挥作用的任何想法?

最佳答案

Catch all routes* 指定或 **句法。地点 [Route("{**catchall}")]在您想要成为捕获所有操作的操作上。这将为所有以 Controller 路由属性中指定的前缀为前缀的路由创建一个捕获所有路由。

[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)
{

}

这将捕获与任何其他指定路线不匹配的任何路线。

关于c# - 核心 API Controller 捕获所有未知路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56587342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com