我已将 ApiController 添加到我的 asp.net core 2.2 应用程序中,并且来自 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 回答
长风秋雁
TA贡献1757条经验 获得超7个赞
您正在混合传统路由和属性路由:
操作要么是传统路由,要么是属性路由。将路由放置在控制器或操作上使其具有路由属性。定义属性路由的操作无法通过常规路由到达,反之亦然。控制器上的任何路由属性都会使控制器属性中的所有操作都路由。
示例中的以下调用配置传统路由模板:
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]
属性,因为这需要属性路由。
- 1 回答
- 0 关注
- 80 浏览
添加回答
举报
0/150
提交
取消