2013-03-30 2 views
29

ich meine WebApiConfig wie diese konfiguriert haben:Keine HTTP-Ressource wurde gefunden, dass die Anforderungs-URI in Web-API entspricht

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

Ich habe eine Methode, die einen Parameter akzeptiert. Der zugreifende URI ist http://localhost:8598/api/WebApi/GetLocationCategory/87.

Das gibt mir eine Fehlermeldung: 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

Das Problem URI sein sollte: http: // localhost: 8598/api/WebAPI/GetLocationCategory CatID = 87 – DharaPPatel

Antwort

3

was ist der Name Ihres Controller und die Aktion?

Die URL-

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

ist Es spielt keine Karte in der Route Konfiguration Sie angegeben haben, daher ist die Pipeline der richtigen Controller finden nicht in der Lage. Der/id sollte nicht im Weg sein, es in den Körper oder den Abfrageparametern sein muss (ich in Eile stapfte habe !!)

Beispiel: -

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

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

O/P :- 1 

Hinweis: - Wenn Ihr Aktionsname ist GetIndex dann muss die URL GetIndex nicht nur Index sein. Optional können Sie das Attribut [HttpGet] für die Aktion angeben.

Wenn Sie den folgend als auch in Ihrem WebApi.config haben

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

Dann http://localhost:58432/api/foo?Id=1 wäre auch ein legitimer Weg sein. Nicht sicher, ob du das willst.

Auch, mit WebAPI so weit wie möglich zu Non-Action-basierten Routing bleiben, ist MVC dafür gedacht. Es ist nicht der empfohlene Weg.

+0

Controller Name: WebAPI , Name der Aktion: GetLocationCategory, der Pfad ist korrekt, denke ich! nicht in der Lage, das Problem zu lösen .. – DharaPPatel

+0

den Code für den Controller eingeben? –

+0

hat den ursprünglichen Post für weiteren Code bearbeitet – DharaPPatel

22

Versuchen Sie, Ihre Controller-Methode als

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

Die Änderung nur ändern, Eingabeparameter id von CatId Ändern .... Es funktioniert für mich viele Male ..

bearbeiten:


Es ist eine lange Zeit, wenn ich zurückblicke Ich denke Ich kenne den Grund jetzt. Words Like Jared ist richtig, es ist alles mit Routing zu tun, die wir angeben. Wenn ich eine Route (Standard), wie haben:

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

Und meine URL ist /MyController/GetLocationCategory/123, wird es /MyController/GetLocationCategory?id=123 gleichwertig sein.

In ähnlicher Weise, wenn ich meinen Parametername für Id ändern möchte, um CatId zu sagen, dann muss ich den Abfragezeichenfolgenparameter ändern (die Art, wie ich meine Controller-Aktion aufrufen würde ändern).Welche wäre jetzt:

/MyController/GetLocationCategory?CatId=123

+3

Das hat es für mich repariert ... Was zum Teufel ist das? – wasatchwizard

+4

@wasatchwizard Ich denke, die Argumentnamen der Methode müssen mit dem übereinstimmen, was Sie in Ihre Route geschrieben haben, was in diesem Fall "{id}" ist. –

+0

@WordsLikeJared - Sie hatten Recht. Ich habe meine Antwort aktualisiert. Ich hoffe es richtig erklärt. – Shubh

2

Ihre Anfrage URL ist http://localhost:8598/api/WebApi/GetLocationCategory/87

Ihre Route akzeptieren konfiguriert ist: 'api/{Controller}/{Aktion}/{id}'

So Sie müssen sicherstellen, dass der Name Ihres Controllers "WebApiController" lautet.

Auch als alredy von @SDG angegeben müssen Sie sicherstellen, dass der Name des Parameters auf Ihre Aktion-Methode übereinstimmt, was Sie in Ihrer Route Vorlage dh Änderung haben ‚catID‘ zu ‚id‘

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

maps:

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

der WebApi Teil der uRL ist redundant mit api. Ändern Sie dann die Methode Parameternamen um die Strecke entsprechen:

public IEnumerable<LocationCategory_CLS> GetLocationCategory(int id)

Dies ist ein guter Standard, wie es die Konvention übereinstimmt.

Alternativ können Sie die Route ändern diese unkonventionellen Parameternamen stattdessen zu verwenden:

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

schließlich in jedem Fall sicherstellen, dass der Controller-Name in Controller endet.

Gute Namen: CustomController, CustomApiController
Bad Namen: Custom, CustomApi

+1

Gute und schlechte Namen haben mein Problem gelöst – Cherry

Verwandte Themen