如何修复 webAPI 中不正确的操作路由
Posted
技术标签:
【中文标题】如何修复 webAPI 中不正确的操作路由【英文标题】:How to fix incorrect action routing in a webAPI 【发布时间】:2020-01-09 19:49:52 【问题描述】:在测试 html 页面中通过 JS 调用我的 API 时,它无法返回任何结果。做了一些研究,我得出的结论是,它要么没有找到我的 API 控制器(不太可能,因为它使用一些示例代码但使用相同的 URI 返回了结果),或者正在找到它但没有找到正确的操作。该应用程序的重点是发送一个 youtube 搜索请求并接收返回的结果列表。
我尝试在整个代码中设置断点,它似乎只通过 HTML 页面上的 JS 运行,但从未真正命中控制器本身。当我添加一个不带参数的新方法只返回列表的一个结果时,这种情况发生了变化,该结果确实返回了结果,但在看似没有改变任何东西后不久就停止了工作。
这是调用 API 的 HTML 文档中的代码
var uri = 'api/Search';
function formatItem(item)
return item.title;
function find()
var word = $('#srval').val();
$.getJSON(uri + '/' + word)
.done(function (data)
$('#product').text(formatItem(data));
)
.fail(function (jqXHR, textStatus, err)
$('#product').text('Error: whyyyyyyyyyyyyy');
);
这是用于 API 路由的默认代码:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/controller/id",
//defaults: new id = RouteParameter.Optional
defaults: new id = RouteParameter.Optional
);
这是我试图调用的控制器方法
[HttpGet]
public IHttpActionResult GetSearch(string search)
getyoutuberesults(search);
var results = searcheslist;
return Ok(results);
以及代码中显示的搜索控制器的名称,其中删除了其中的方法:
public class SearchController : ApiController
...
预期结果是 HTML 标记“product”填充了 YouTube 搜索 HTML 标记“srval”值的结果。
相反,页面只是在点击搜索按钮时冻结,并且如上所述似乎从未到达 GetSearch 方法。直接访问 URI localhost:44345/api/Search/[search term] 会导致以下错误消息:
未找到与请求 URI 'https://localhost:44345/api/Search/test' 匹配的 HTTP 资源。 在与请求匹配的控制器“搜索”上未找到任何操作。
【问题讨论】:
【参考方案1】:路由模板参数名称不匹配。默认约定路由具有id
,而控制器操作具有search
参数。导致找不到所需操作的匹配项 (404)。
考虑使用属性路由,首先启用它
// Attribute routing.
config.MapHttpAttributeRoutes(); //<---THIS HERE BEFORE CONVENTION BASED ROUTING
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional
);
并相应地装饰控制器
[RoutePrefix("api/search")]
public class SearchController : ApiController
//...
//GET api/search/word
[HttpGet]
[Route("search")]
public IHttpActionResult GetSearch(string search)
var results = getyoutuberesults(search);
return Ok(results);
//...
参考Attribute Routing in ASP.NET Web API 2
【讨论】:
这很好用,谢谢。如果我想实现其他方法,我只需在方法前添加c# [Route("parameter")]
,对吗?以上是关于如何修复 webAPI 中不正确的操作路由的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 Berkeley DB 文件中不正确的 XML 标签