如何修复WebAPI中的错误操作路由

时间:2019-09-07 03:16:30

标签: c# asp.net-web-api asp.net-web-api-routing

在测试HTML页面中通过JS调用我的API时,无论如何都不会返回任何结果。经过研究,我得出的结论是,它没有找到我的API控制器(不太可能,因为它使用一些示例代码但具有相同的URI返回了结果),或者是找到了但没有找到正确的操作。该应用程序的重点是发送youtube搜索请求并接收返回的结果列表。

我尝试在整个代码中设置断点,它似乎只在HTML页面上的JS中运行,而从未真正击中控制器本身。当我添加了一个不带参数的新方法以返回列表的一个结果(确实返回了结果),但是似乎在没有任何更改的情况下不久就停止工作时,这种情况发生了改变。

这是HTML文档中调用API的代码

<div style="width:500px;margin:0 auto;position:relative;">
  <div style="background-color:yellow;height:100px">Header</div>
  <div style="background-color:aquamarine; height: 400px">Body</div>
  <div style="background-color:red;width:100px;position:absolute;top:100px;right:0;">ABC</div>
</div>

这是用于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');
                });
        }

这是我要调用的控制器方法

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);
        }

预期结果是HTML标签“ product”充满了YouTube搜索HTML标签“ srval”的值的结果。

相反,该页面仅在按下搜索按钮时冻结,并且如上所述,看上去甚至从未到达GetSearch方法。直接转到URI localhost:44345 / api / Search / [搜索词]会导致以下错误消息:

找不到与请求URI'https://localhost:44345/api/Search/test'相匹配的HTTP资源。 在控制器“搜索”上未找到与请求匹配的操作。

1 个答案:

答案 0 :(得分:3)

路由模板参数名称不匹配。默认约定路由为{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