【问题标题】:What route do I add to map to an API controller?我应该添加什么路由来映射到 API 控制器?
【发布时间】:2020-01-28 13:46:07
【问题描述】:

我已向我的 asp.net core 2.2 应用程序添加了一个 ApiController,并且来自 UI 的异步调用不匹配。

这是我在 Startup.cs 中的路线。

app.UseMvc(config =>
{
    config.MapRoute(
        "Api",
        "api/{controller}/{action}/{id?}"
    );

    config.MapRoute(
        "Default", 
        "{controller=App}/{action=Index}/{id?}"
    );
});

这是向 API 控制器发出各种 GET 请求的 javascript 函数之一。

function clearAllFilters() {
  $.get({
    url: "/api/GridFilter/ClearAllFilters",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function () {
        console.log('filters cleared');
    }
  });
}

这里是 API 控制器:

[Route("api/[controller]")]
[ApiController]
public class GridFilterController : ControllerBase
{
    private static readonly string[] FilterFields = {
        // Bunch of strings, omitted for brevity
    };

    [HttpGet]
    public IActionResult ClearAllFilters()
    {
        foreach (string column in FilterFields)
        {
            if (HttpContext.Session.TryGetValue(column, out byte[] savedJson))
            {
                HttpContext.Session.Remove(column);
            }
        }
        return Ok(true);
    }

为什么 asp.net 不匹配这个?我的 url 是 /api/controller/action ,它似乎与启动时映射的第一条路由匹配。

【问题讨论】:

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


    【解决方案1】:

    你是mixing Conventional Routing and Attribute Routing:

    动作要么是传统路由,要么是属性路由。在控制器或操作上放置路由使其属性路由。定义属性路由的动作不能通过常规路由到达,反之亦然。 任何控制器上的路由属性使控制器属性中的所有动作都被路由。

    您示例中的以下调用配置了常规路由模板:

    config.MapRoute("Api","api/{controller}/{action}/{id?}");
    

    但是,您已通过路由属性 ([Route(...)]) 将 GridFilterController 配置为使用属性路由:

    [Route("api/[controller]")]
    [ApiController]
    public class GridFilterController : ControllerBase
    

    要从/api/GridFilter/ClearAllFilters 访问ClearAllFilters 操作,您有两个常规选项:

    1. 将属性路由模板更改为:

      [Route("api/[controller]/[action]")]
      

      这意味着动作的名称将作为路由的一部分包含在内,这与您设置的常规路由模板类似。

    2. 完全删除[Route(...)] 属性。但是,这并不理想,因为您还必须删除 [ApiController] 属性,因为 requires attribute routing

    【讨论】:

    • 谢谢。我搜索并搜索了 Microsoft 的文档,但不知何故没有了解您必须为 api 控制器使用基于属性的路由的细节。我按照您的建议选择了选项 1。现在效果很好。
    • 我在属性路由要求的答案中添加了一个文档链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2021-09-21
    相关资源
    最近更新 更多