【问题标题】:How could I define the route for RestAPI on startup in ASP.NET Core?如何在 ASP.NET Core 启动时定义 Rest API 的路由?
【发布时间】:2020-07-10 02:20:18
【问题描述】:

我知道如何使用属性定义路线,例如:

    [Route("api/v1/[controller]")]
    [ApiController]
    public class OTGController
    {
        [HttpGet("UpdateData")]
        public void UpdateData()
        {
            // to do...
        }
    }

但这不是很容易使用,我需要在添加新控制器时随时配置它。

首先,控制器的路由总是:“api/v1/[controller]”。我不想在每个控制器中都配置它。

其次,UpdateData 的路由是“UpdateData”。他们是一样的。我想这样定义它:

        [HttpGet]
        public void UpdateData()
        {
            // to do...
        }

如果我将路由留空,我希望它使用方法名称UpdateData 作为路由。这与默认行为不同。 如果不为空,我希望它使用定义的路由。

我想要我的最终代码:

    [ApiController]
    public class OTGController
    {
        [HttpGet]
        public void UpdateData()
        {
            // to do...
        }
    }

这个类中没有定义路由,应该按照我在启动时配置的规则成功生成路由。 怎么样?

【问题讨论】:

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


    【解决方案1】:

    解决方案 1:

    您可以覆盖默认的EndpointMiddleware 中间件。更新 Startup 类上的函数 Configure(IApplicationBuilder app, IWebHostEnvironment env)

    ...
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            "Default",
            "api/v1/{controller}/{action=UpdateData}"
        );
    });
    ...
    

    警告:您需要将 ApiControllerAttribute 删除到您的 Api 控制器。带有ApiControllerAttribute 注释的控制器上的操作方法必须是属性路由。

    解决方案 2:

    您始终可以创建 API 基控制器类。

    [ApiController]
    [Route("api/v1/[controller]")]
    public class ApiControllerBase : ControllerBase
    {
        [HttpGet("")]
        public virtual IActionResult UpdateData()
        {
            return NoContent();
        }
    }
    
    public class OTGController : ApiControllerBase
    {
        public override IActionResult UpdateData()
        {
            return Ok("Updated!");
        }
    }
    

    解决方案 3:

    EndpointMiddleware配置:

    ...
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            "Default",
            "api/v1/{controller}/{action=UpdateData}"
        );
    
        endpoints.MapControllers();
    });
    ...
    

    控制器:

    [ApiController]
    [Route("api/v1/[controller]")]
    public class ApiControllerBase : ControllerBase
    {
    }
    
    public class OTGController : ApiControllerBase
    {
        public IActionResult UpdateData()
        {
            return Ok("Updated!");
        }
    }
    

    【讨论】:

    • 非常感谢。第一个,我试过了:我添加了默认的 MapControllerRoute 并从控制器中删除了 [Route("api/v1/[controller]")] 。 api 的路径变为:“/UpdateData”。在我从 HttpGet 属性中删除路由参数之后。 Web API 消失了。这个解决方案对我不起作用。尝试第二个
    • 第二个:是的,它解决了我的第一个问题,控制器路由被基类固定为`[Route("api/v1/[controller]")]`。但我的第二个问题仍未解决。我无法将方法添加到基类。
    • @HalfLegend 两种解决方案都为我测试过。它应该工作。无论如何,对于解决方案 2,您可以进行更改。您可以删除虚拟功能并覆盖EndpointMiddleware 中间件中的默认操作。我将添加一个 3 解决方案来显示此变体。
    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2017-04-13
    • 2018-12-09
    • 2022-01-18
    相关资源
    最近更新 更多