如何修复 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 标签

如何从 WebApi 操作返回 html 页面?

支持 GUID 和整数 ID 的 Web API 路由

WebAPI从零开始学会使用WebAPI

如何修复 Firefox 和 Chrome 中不一致的 Textarea 下边距?

如何修复生成的文档中不需要的 HTML 代码?