我要添加什么路径才能映射到API控制器?

时间:2019-09-28 15:55:27

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

我已在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与此不匹配?我的网址是/ api / controller / action,它似乎与启动时映射的第一条路线匹配。

1 个答案:

答案 0 :(得分:1)

您是mixing Conventional Routing and Attribute Routing

  

按常规路线或属性路线进行操作。在控制器或操作上放置路由会使其路由属性。定义属性路由的操作无法通过常规路由来实现,反之亦然。控制器上的任何路由属性都将路由控制器属性中的所有操作。

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

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

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

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

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

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

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

    这意味着操作名称将包含在路由中,这与您设置的常规路由模板相似。

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