c# - 如何修复 webAPI 中不正确的操作路由

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

当在测试 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);
    }

    //...
}

引用Attribute Routing in ASP.NET Web API 2

关于c# - 如何修复 webAPI 中不正确的操作路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57830389/

相关文章:

javascript - 带参数的 WebApi 404 - 通过 javascript GET 调用

c# - 使用 Asp.net MVC web.api 为什么我应该重定向而不是仅仅调用其他函数?

c# - ArcGIS Desktop API - 检查渲染是否完成

c# - 12 小时时间格式的正则表达式

.net - 我如何让 WebAPI 拒绝带有无效负载的请求?

jquery - ASP.NET WebAPI - 如何使用 $.getJSON 传递对象

c# - MVC 中的 web api 不再工作

c# - 使用 Angular2 进行 Azure IIS 路由 --> 404

c# - Ninject 的 UnitOfWork 模式应该使用什么选项

c# - .Net 的最佳文档工具