我已在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,它似乎与启动时映射的第一条路线匹配。
答案 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
操作,您有两个常规选项:
将属性路由模板更改为:
[Route("api/[controller]/[action]")]
这意味着操作名称将包含在路由中,这与您设置的常规路由模板相似。
完全删除[Route(...)]
属性。但是,这并不理想,因为您还必须删除[ApiController]
属性,因为该属性requires attribute routing。