【问题标题】:How to fix incorrect action routing in a webAPI如何修复 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 资源。 在与请求匹配的控制器“搜索”上未找到任何操作。

【问题讨论】:

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


    【解决方案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}")] ,对吗?
    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2012-09-23
    • 2016-07-13
    • 2010-09-07
    • 2019-01-09
    相关资源
    最近更新 更多