2013-03-30 116 views
29

请求URI我已经配置我WebApiConfig这样的:没有HTTP资源发现匹配的Web API

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

问题解决了URI应为:http://本地主机:8598/API /的WebAPI/GetLocationCategory CATID = 87 – DharaPPatel

回答

3

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

URL应该

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就是为此而设计的。这不是推荐的方式。

+0

控制器名称:?的WebAPI ,动作名称:GetLocationCategory,路径是正确的,我猜!无法找出问题。 – DharaPPatel

+0

发布控制器的代码? –

+0

编辑原始文章的进一步代码 – DharaPPatel

22

试着改变你的控制器方法

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

的变化是唯一的,变化的输入参数从CatIdid ....它为我的作品多次..

编辑


很久以前我回头看我认为我现在知道原因。 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,那么我需要更改查询字符串参数(我调用我的控制器操作的方式会改变)。现在是:

/MyController/GetLocationCategory?CatId=123

+3

这修正了我..这到底是什么? – wasatchwizard

+4

@wasatchwizard我认为方法参数名称需要与您在路由中放置的内容相匹配,在这种情况下为'{id}'。 –

+0

@WordsLikeJared - 你是对的。我已经更新了我的答案。 我希望能正确解释。 – Shubh

2

你请求的URL是http://localhost:8598/api/WebApi/GetLocationCategory/87

你的路由配置为接受: 'API/{控制器}/{行动}/{ID}'

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

此外,由@SDG alredy说,你需要确保该参数的操作方法的名称相匹配你在你的路径模板,即变“CATID”到“身份证”

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

映射到:

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

URL的WebApi部分是冗余的api。然后修改方法的参数名称相匹配的路线:

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id)

这是一个很好的默认,因为它的约定相匹配。

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

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

最后,在任何情况下确保控制器名称Controller结束。

好名字:CustomControllerCustomApiController
坏话:CustomCustomApi

+1

好名称和坏名字解决了我的问题 – Cherry

相关问题