首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Web API中找不到与请求URI匹配的HTTP资源

在Web API中找不到与请求URI匹配的HTTP资源
EN

Stack Overflow用户
提问于 2013-03-30 14:33:48
回答 4查看 87.6K关注 0票数 32

我已经这样配置了我的WebApiConfig:

代码语言:javascript
运行
复制
public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

我有一个接受一个参数的方法。访问URI是http://localhost:8598/api/WebApi/GetLocationCategory/87

这给了我一个错误:No HTTP resource was found that matches the request URI 'http://localhost:8598/api/WebApi/GetLocationCategory/87'

控制器:

代码语言:javascript
运行
复制
public IEnumerable<LocationCategory_CLS> GetLocationCategory(int CatID)
{
    var LocCats = (from lct in entities.tdp_LocationCategories join lc in entities.tdp_LocationMaster on lct.FK_LocationID equals lc.LocationID where lct.IsApproved == 0 && lct.FK_CategoryID == CatID select new { lc.LocationID, lc.LocationName }).ToList();
    List<LocationCategory_CLS> loc = new List<LocationCategory_CLS>();

    foreach (var element in LocCats)
    {
        loc.Add(new LocationCategory_CLS
        {
            LocationID = element.LocationID,
            LocationName = element.LocationName
        });
    }
    return loc;
}
EN

回答 4

Stack Overflow用户

发布于 2013-03-30 17:21:49

尝试将您的控制器方法更改为

代码语言:javascript
运行
复制
public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id) <-- Change
{
    var LocCats = (from lct in entities.tdp_LocationCategories join lc in entities.tdp_LocationMaster on lct.FK_LocationID equals lc.LocationID where lct.IsApproved == 0 && lct.FK_CategoryID == id select new { lc.LocationID, lc.LocationName }).ToList();
    List<LocationCategory_CLS> loc = new List<LocationCategory_CLS>();

    foreach (var element in LocCats)
    {
        loc.Add(new LocationCategory_CLS
        {
            LocationID = element.LocationID,
            LocationName = element.LocationName
        });
    }
    return loc;
}

唯一的变化是,将输入参数从CatId更改为id...它对我很有效很多次..

编辑

很长一段时间以来,当我回顾的时候,我想,我现在知道原因了。Words Like Jared是正确的,这一切都与我们指定的路由有关。如果我有一个路由(默认)为:

代码语言:javascript
运行
复制
routes.MapRoute(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );

我的网址是/MyController/GetLocationCategory/123,它等同于/MyController/GetLocationCategory?id=123

类似地,如果我想将Id的参数名称更改为CatId,那么我需要更改查询字符串参数(我调用控制器操作的方式将会更改)。现在是:

/MyController/GetLocationCategory?CatId=123

票数 23
EN

Stack Overflow用户

发布于 2014-04-15 04:13:19

代码语言:javascript
运行
复制
config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

映射到:

http://localhost:8598/api/Controller/Action/id

对于api,url的WebApi部分是多余的。然后修改方法参数名称,使之与路由匹配:

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id)

这是一个很好的默认值,因为它符合约定。

或者,您可以修改路由以使用此非常规参数名称:

代码语言:javascript
运行
复制
config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{CatID}",
            defaults: new { CatID = RouteParameter.Optional }
        );

最后,无论哪种情况,都要确保控制器名称以Controller结尾。

好名字:CustomControllerCustomApiController

坏名字:CustomCustomApi

票数 7
EN

Stack Overflow用户

发布于 2013-03-30 14:37:15

您的控制器和操作的名称是什么?

URL应为

代码语言:javascript
运行
复制
http://localhost:8598/api/Controller/Action

它不会映射到您指定的路由配置,因此管道无法找到正确的控制器。/id不应该在必须在主体或查询参数中的路径中(我在匆忙中被难倒了!!)

示例:-

代码语言:javascript
运行
复制
public class FooController : ApiController
    {
        public int GetIndex(int id)
        {
            return id;
        }
    }

localhost:58432/api/foo/GetIndex?Id=1

O/P :- 1

注意:-如果你的行动名称是索引,那么网址必须是GetIndex,而不仅仅是索引。您还可以为操作指定[HttpGet]属性。

如果您的WebApi.config中也包含以下内容

代码语言:javascript
运行
复制
config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

那么http://localhost:58432/api/foo?Id=1也将是一个合法的路由。我不确定你是否愿意。

此外,对于WebAPI,尽可能坚持基于非动作的路由,MVC就是这样做的。这不是推荐的方式。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15715744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档