【问题标题】:No HTTP resource was found that matches the request URI in Web API未找到与 Web API 中的请求 URI 匹配的 HTTP 资源
【发布时间】:2013-03-30 06:33:48
【问题描述】:

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

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'

控制器:

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

【问题讨论】:

标签: asp.net-mvc asp.net-web-api


【解决方案1】:

尝试将控制器方法更改为

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 是正确的,这与我们指定的路由有关。如果我有一条路线(默认):

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,那么我需要更改查询字符串参数(我调用 Controller Action 的方式会改变)。现在是:

/MyController/GetLocationCategory?CatId=123

【讨论】:

    【解决方案2】:
    config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    

    映射到:

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

    网址的WebApi 部分与api 是多余的。然后修改方法参数名称以匹配路由:

    public IEnumerable&lt;LocationCategory_CLS&gt; GetLocationCategory(int id)

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

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

    config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{CatID}",
                defaults: new { CatID = RouteParameter.Optional }
            );
    

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

    好名字:CustomControllerCustomApiController
    坏名:CustomCustomApi

    【讨论】:

      【解决方案3】:

      你的控制器和动作的名称是什么?

      网址应该是

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

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

      例子:-

      public class FooController : ApiController
          {
              public int GetIndex(int id)
              {
                  return id;
              }
          }
      
      localhost:58432/api/foo/GetIndex?Id=1
      
      O/P :- 1
      

      注意:- 如果您的操作名称是 GetIndex,那么 URL 必须是 GetIndex 而不仅仅是索引。您可以选择为操作指定[HttpGet] 属性。

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

      config.Routes.MapHttpRoute(
                      name: "DefaultApi",
                      routeTemplate: "api/{controller}/{id}",
                      defaults: new { id = RouteParameter.Optional }
                  );
      

      那么http://localhost:58432/api/foo?Id=1 也是合法路由。不知道你是否想要。

      另外,WebAPI 尽可能坚持非基于动作的路由,MVC 就是为此而生的。这不是推荐的方式。

      【讨论】:

      • 控制器名称:WebApi,操作名称:GetLocationCategory,我猜路径是正确的!无法弄清楚问题..
      【解决方案4】:

      您的请求网址是http://localhost:8598/api/WebApi/GetLocationCategory/87

      您的路由配置为接受:'api/{controller}/{action}/{id}'

      所以你需要确保你的控制器的名字是'WebApiController'。

      此外,正如@SDG 所述,您需要确保您的操作方法的参数名称与您在路由模板中的名称相匹配,即将“CatID”更改为“id”

      【讨论】:

        猜你喜欢
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多