如何修复 webAPI 中不正确的操作路由
How to fix incorrect action routing in a webAPI
在测试 HTML 页面中通过 JS 调用我的 API 时,它无法 return 任何结果。做一些研究,我得出的结论是它要么没有找到我的 API 控制器(不太可能,因为它 return 使用一些示例代码但相同的 URI 编辑了结果)或者正在寻找它但没有找到正确的动作。该应用程序的要点是发送一个 youtube 搜索请求并接收返回的结果列表。
我已经尝试在整个代码中设置断点,它似乎只能通过 HTML 页面上的 JS 运行,但从未真正击中控制器本身。当我添加一个不带参数的新方法时,这种情况发生了变化,只是 return 列表的一个结果,该结果执行 return 结果,但似乎没有任何改变后不久就停止工作了。
这是 HTML 文档中调用 API
的代码
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/[搜索词] 会导致以下错误消息:
找不到与请求 URI“https://localhost:44345/api/Search/test”匹配的 HTTP 资源。
在控制器 'Search' 上找不到与请求匹配的操作。
路由模板参数名称不匹配。默认约定路由具有 {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);
}
//...
}
在测试 HTML 页面中通过 JS 调用我的 API 时,它无法 return 任何结果。做一些研究,我得出的结论是它要么没有找到我的 API 控制器(不太可能,因为它 return 使用一些示例代码但相同的 URI 编辑了结果)或者正在寻找它但没有找到正确的动作。该应用程序的要点是发送一个 youtube 搜索请求并接收返回的结果列表。
我已经尝试在整个代码中设置断点,它似乎只能通过 HTML 页面上的 JS 运行,但从未真正击中控制器本身。当我添加一个不带参数的新方法时,这种情况发生了变化,只是 return 列表的一个结果,该结果执行 return 结果,但似乎没有任何改变后不久就停止工作了。
这是 HTML 文档中调用 API
的代码
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/[搜索词] 会导致以下错误消息:
找不到与请求 URI“https://localhost:44345/api/Search/test”匹配的 HTTP 资源。 在控制器 'Search' 上找不到与请求匹配的操作。
路由模板参数名称不匹配。默认约定路由具有 {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);
}
//...
}