2016-07-30 41 views
1

wirklich Probleme haben, um sich mit MVC Routing bekommen trotz Belastungen von Blogs und Tutorials auf sie zu lesen ...MVC Routing-Probleme

ich diese WebAPI Funktion haben:

public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts) 

und die Standardroute in Route.config :

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

Alles funktioniert gut.

Ich habe nun eine weitere Funktion hinzugefügt:

public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories) 

Trotz der Aktionsnamen anders zu sein, scheint es einen Konflikt zu sein, und wenn einer von ihnen ruft erhalte ich eine 500 internal server error - ich denke, es ist nicht kennt welches zu verwenden.

ich sie bin Aufruf URL:

api/webapiproducts/upsertproducts?marketplaceId={0}&datasourceId={1} 

Ich habe versucht, mithilfe von Attribut, um das Problem zu bekommen Routing:

[Route("/api/WebApiProducts/upsertproducts/{marketplaceid}/{datasourceid}")] 
public HttpResponseMessage UpsertProducts([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergProduct> heisenbergProducts) 

und

[Route("/api/WebApiProducts/reviseinventory/{marketplaceid}/{datasourceid}")] 
public HttpResponseMessage ReviseInventory([FromUri] int marketplaceId, [FromUri] int datasourceId, [FromBody]List<HeisenbergReviseInventory> heisenbergReviseInventories) 

Keines meiner Routing Attribute scheinen zu funktionieren. Was mache ich falsch und was verstehe ich hier nicht?

Wie @Nkosi wies darauf hin, ich würde die falsche Route Datei! Hier ist mein WebApiConfig.cs Inhalt:

config.MapHttpAttributeRoutes(); 

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

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

Antwort

0

Verwaltet es mit dem Attribut zu erhalten arbeiten Routing durch das Ändern der URL ich dazu bin Aufruf:

string.Format("api/webapiproducts/reviseinventory/{0}/{1}", marketplaceId, datasourceId); 
1

Die Route Config Sie zeigte für MVC nicht web api. Achten Sie auf die WebApiConfig.cs-Datei, die die Route für Web API

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

     // Convention-based routing. 
     config.Routes.MapHttpRoute(
      name: "DefaultActionApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

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

Die Standardkonvention basierte Route Setup dieser sieht in der Regel wie

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

mit aus der Aktion Platzhalter eingerichtet haben wird, die, was wäre verursacht Ihre Route Konflikte.

Attribut Routing tun, um dieses

config.MapHttpAttributeRoutes(); 

Aktualisieren der WebApiConfig enthalten die richtige Setup sollte Ihr Problem beheben sowohl Konvention basierte zu ermöglichen und Routing-Attribut.

+0

Sie haben recht - ich die falsche Konfigurationsdatei contect hinzugefügt - ich habe die Frage aktualisiert haben die richtigen Daten. Immer noch Probleme mit meinen Abfrage-String-Parametern. Ich habe es geschafft, indem ich die URL, die ich anrufe, geändert habe - ich dachte, du könntest beides machen. Siehe meine Antwort – Rick

+1

@Rick. Sie können in beide Richtungen arbeiten. Die Reihenfolge der Mapping-Routen ist wichtig, da die erste Route mit Gewinnen übereinstimmt, wobei spezifischere Routen zuerst gemappt werden und allgemeinere Routen später auf der Linie abgebildet werden.Sie müssen die Reihenfolge ändern, indem Sie die letzte Zuordnung um eins erhöhen. es erreicht die zweite konventionsbasierte Route nicht, da sie bereits mit der ersten übereinstimmt. – Nkosi

+0

danke, ja du hast recht über die bestellung - ich habe es vergessen. Ich änderte die Reihenfolge und versuchte mit der Querystring-Methode aufzurufen, aber es funktionierte immer noch nicht. Ich muss immer noch die Methode anwenden, die ich in meine Antwort eingefügt habe. – Rick