2013-03-30 62 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

相關問題