2013-03-30 10 views
29

ho configurato il mio WebApiConfig in questo modo:No risorsa HTTP è stato trovato che corrisponde l'URI della richiesta in Web API

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

Ho un metodo che accetta un parametro. L'URI di accesso è http://localhost:8598/api/WebApi/GetLocationCategory/87.

Questo mi dà un errore: No HTTP resource was found that matches the request URI 'http://localhost:8598/api/WebApi/GetLocationCategory/87'

Controller:

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

risolto il problema URI dovrebbe essere: http: // localhost: 8598/api/WebAPI/GetLocationCategory CatID = 87 – DharaPPatel

risposta

3

qual è il nome del controller e di azione?

L'URL deve essere

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

Non la mappa alla configurazione percorso è stato specificato, da cui il gasdotto è in grado di individuare il controller corretto. Il/id non dovrebbe essere nel percorso deve essere nel corpo o dei parametri di query (mi sono perplesso in fretta !!)

Esempio: -

public class FooController : ApiController 
    { 
     public int GetIndex(int id) 
     { 
      return id; 
     } 
    } 

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

O/P :- 1 

Nota: - Se il nome di azione è GetIndex quindi l'URL deve essere GetIndex non solo Indice. Opzionalmente è possibile specificare l'attributo [HttpGet] per l'azione.

Se è stata la seguente pure nel vostro WebApi.config

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

Poi http://localhost:58432/api/foo?Id=1 sarebbe anche un percorso legittimo. Non sono sicuro se lo vorrai.

Inoltre, con WebAPI per quanto possibile attenersi al routing non basato su azione, MVC è pensato per quello. Non è il modo consigliato.

+0

nome del controller:? WebAPI , Nome azione: GetLocationCategory, path is correct suppongo! non riesci a capire il problema .. – DharaPPatel

+0

inserisci il codice per il controller ?? –

+0

modificato il post originale per ulteriore codice – DharaPPatel

22

provare a cambiare il metodo di controllo come

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

Il cambiamento è solo, cambiando il parametro di ingresso CatId-id .... Funziona per me molte volte ..

Edit:


È da molto tempo che guardo indietro Penso che conosco il motivo ora. Words Like Jared è corretto, tutto ha a che fare con il routing che specifichiamo. Se ho un percorso (di default) come:

routes.MapRoute(
     "Default",            // Route name 
     "{controller}/{action}/{id}",       // URL with parameters 
     new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
    ); 

E il mio URL è /MyController/GetLocationCategory/123, sarà equivalente a /MyController/GetLocationCategory?id=123.

Analogamente, se voglio cambiare il mio nome parametro per Id per dire CatId, allora ho bisogno di cambiare il parametro stringa di query (il modo in cui sto chiamando la mia azione controller cambierebbe).Quale sarebbe ora:

/MyController/GetLocationCategory?CatId=123

+3

Questo lo ha risolto per me .. Che diavolo è quello? – wasatchwizard

+4

@wasatchwizard Penso che i nomi degli argomenti del metodo debbano corrispondere a ciò che si inserisce nel percorso, che è '{id}' in questo caso. –

+0

@WordsLikeJared: eri corretto. Ho aggiornato la mia risposta. Spero che abbia spiegato correttamente. – Shubh

2

L'URL di richiesta è http://localhost:8598/api/WebApi/GetLocationCategory/87

Il percorso è configurato per accettare: '/ {Controller} API/{action}/{id}'

Così è necessario assicurarsi che il nome del controller sia "WebApiController".

Inoltre, come affermato dal alredy @SDG è necessario fare in modo che il nome del parametro per il metodo di azione corrisponde a quello che avete nel vostro itinerario modello vale a dire il cambiamento 'catid' a 'id'

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

Mappe di:

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

la porzione WebApi dell'URL è ridondante con api. Quindi modificare il nome del parametro del metodo per abbinare il percorso:

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id)

Questo è un buon valore predefinito in quanto corrisponde la convenzione.

In alternativa, è possibile modificare il percorso per utilizzare questo nome di parametro non convenzionale, invece:

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

Infine, in entrambi i casi assicurarsi che il nome del controller termina in Controller.

Buone nomi: CustomController, CustomApiController
Bad nomi: Custom, CustomApi

+1

Goodnames e badnames hanno risolto il mio problema – Cherry

Problemi correlati