【问题标题】:Global route for all ApiControllers in .Net 6.Net 6 中所有 ApiController 的全局路由
【发布时间】:2022-10-21 18:53:04
【问题描述】:

在我所有的项目中,我将这段代码放在我的控制器顶部:

[Route("api/[controller]/[action]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult GetTest1()
    {
        return Ok();
    }
    [HttpGet]
    public IActionResult GetTest2()
    {
        return Ok();
    }
    [HttpPost]
    public IActionResult PostTest1(string Request)
    {
        return Ok("value was " + Request);
    }
}

因此,我可以使用操作名称调用我的 API,而无需指定每个操作路线,如下图所示:

这工作正常,但我需要把这条路线放在我项目中所有 ApiControllers 的顶部,当我决定将所有路线更改为新路线时,我需要替换项​​目中的所有路线属性.

我在寻找全局解决方案,例如在我的 program.cs 文件中是这样的:

app.MapControllerRoute(
    name: "default",
    pattern: "api/{controller}/{action}");

问题是当我从我的 API 中删除 RouteAttribute 时,我无法让这段代码工作。

【问题讨论】:

  • 为什么你会厌倦在每个控件上输入 [Route("api/[controller]/[action]")] 而不会厌倦在方法上输入 HttpPost、[HttpGet] 注释?来吧...
  • @MosiaThabo 我的问题是关于路线的,但是如果您有更好的方法来为每种方法指定 Get 或 Post,我会全力以赴。

标签: c# asp.net-core asp.net-core-webapi .net-6.0 webapi


【解决方案1】:

只需按照Global route Prefix 上的这个简单教程进行操作,在将全局路由前缀添加到您的 program.cs 文件后,您还必须删除控制器顶部的路由前缀。

我的招摇:

我的程序.cs

 builder.Services.AddMvc(opt =>
 {
     opt.UseCentralRoutePrefix(new RouteAttribute("core/v1/[controller]/[action]"));
 }

).AddControllersAsServices().AddNewtonsoftJson();

【讨论】:

  • 感谢您的宝贵时间,但我在大约 2 年前发现了这个“全球路线前缀”,但我并没有像这样复杂,因为当您尝试向其他人解释您的项目时,这很痛苦。我知道您的方法有效,但比将 Route 置于所有 API 之上增加了更多时间。
【解决方案2】:

我为此搜索了几个小时,毕竟我没有找到任何简单的解决方案来为 API 创建好的、简单、快速的全球路由,然后我自己尝试了。

解决方案 1:您可以为您的 API 创建一个基类并将您的路由放在该文件中,然后您只能在所有 API 中从该类继承。

APIBase.cs 文件:

[ApiController]
[Route("api/[controller]/[action]")]
public class APIBase: ControllerBase
{
}

下一步:如果您需要在 URL 中包含 id(或任何其他参数),那么您应该仅为该方法添加 RouteAttribute。

ValuesController.cs 文件:

public class ValuesController : APIBase
{
    [HttpGet]
    public IActionResult GetTest1()
    {
        return Ok();
    }
    [HttpGet]
    [Route("{id?}")]
    public IActionResult GetTest2(int id)
    {
        return Ok("value was " + id);
    }
    [HttpPost]
    public IActionResult PostTest1(string Request)
    {
        return Ok("value was " + Request);
    }
}

编辑 :

解决方案 2:您可以在项目中创建一个字符串 const 并在所有 API 中使用它(@Serge 建议)

HelperStatic.cs 文件:

public static class HelperStatic
{
    public const string BaseAPIRoute = "api/[controller]/[action]";
}

ValuesController.cs 文件:

[ApiController]
[Route(HelperStatic.BaseAPIRoute)]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult GetTest1()
    {
        return Ok();
    }
    [HttpGet]
    [Route("{id?}")]
    public IActionResult GetTest2(int id)
    {
        return Ok("value was " + id);
    }
    [HttpPost]
    public IActionResult PostTest1(string Request)
    {
        return Ok("value was " + Request);
    }
}

你的招摇将是这样的(在两种解决方案上):

【讨论】:

  • 而不是只添加一行 [Route("api/[controller]/[action]")] 您添加了具有同一行的整个基本控制器。如果您无事可做,只需制作一个字符串 const
  • @Serge 好吧,如果您决定一次全部更改路线,这很有用,这正是我需要在我的一个项目中做的,然后我不得不更改 30 个 API 文件。
  • 这就是我建议你的 - 定义一个全局 const "api/[controller]/[action]" 并在你想要的任何地方使用它
  • @Serge实际上这不是坏主意。
猜你喜欢
  • 2012-04-03
  • 2018-07-14
  • 1970-01-01
  • 2013-08-04
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多