当在测试 HTML 页面中通过 JS 调用我的 API 时,它无法返回任何结果。经过一些研究,我得出的结论是,它要么没有找到我的 API Controller (可能性较小,因为它使用一些示例代码但使用相同的 URI 返回了结果),要么找到了它但没有找到正确的操作。该应用程序的重点是发送 YouTube 搜索请求并接收返回的结果列表。
我尝试在整个代码中设置断点,它似乎只通过 HTML 页面上的 JS 运行,但从未真正命中 Controller 本身。当我添加一个不带参数的新方法只返回列表的一个结果时,这种情况发生了变化,该方法确实返回了结果,但在似乎没有更改任何内容后不久就停止工作了。
这是调用 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 }
);
这是我尝试调用的 Controller 方法
[HttpGet]
public IHttpActionResult GetSearch(string search)
{
getyoutuberesults(search);
var results = searcheslist;
return Ok(results);
}
以及代码中显示的搜索 Controller 的名称,其中删除了其中的方法:
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 资源'。 在 Controller “搜索”上未找到与请求匹配的操作。
最佳答案
路由模板参数名称不匹配。默认约定路由具有 {id}
,而 Controller 操作具有 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 }
);
并相应地装饰 Controller
[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);
}
//...
}
关于c# - 如何修复 webAPI 中不正确的操作路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57830389/