2017-08-16 5 views
1

Peculiar Situation, ich habe diese MethodeRouting für HTTP-Get ohne Argumente funktioniert nicht (web.api)

[HttpGet] 
    [Route("api/models/getallmachines")] 
    public IHttpActionResult GetAllMachines() 
    { 
     var model= db.machine.ToList(); 
     return Ok(model); 
    } 

Und ich bekomme immer, dass die Ressource nicht gefunden wurde, als http://localhost:xxx/api/models/getallmachines Aufruf. Aber wenn ich ein Argument hinzufügen, sagen

[HttpGet] 
    [Route("api/models/getallmachines/{blub}")] 
    public IHttpActionResult GetAllMachines(int blub) 
    { 
     var model= db.machine.ToList(); 
     return Ok(model); 
    } 

Es arbeitet mit http://localhost:xxx/api/models/getallmachines/0! Warum? Das ist mein webapiconfig

public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 

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

     var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"); 
     config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType); 
    } 

UPDATE

Verwendung von route Debugger im Browser erhalte ich see image below

Es gibt eine andere Methode in demselben Controller ist, diese hier

[HttpGet] 
    [Route("api/models/getmodel/{id}")] 
    public IHttpActionResult GetModel(int id) 
    { 
     var model = models.FirstOrDefault(p => p.ApiModelId == id); 
     if (model == null) 
      return NotFound(); 
     return Ok(model); 
    } 

Welches gibt mir die JSON-Datei im Browser und diese Route Debugger Informationen

enter image description here

+0

Was passiert, wenn Sie routeTemplate zu ändern: "api/{Controller}/{Aktion}/{ID}". Dann würden getallmachines als die Aktion abgebildet werden. Ich vermute, dass es jetzt vielleicht als id gedeutet werden könnte. – m4ttsson

+0

Nein, das war es nicht, leider – rst

+0

Was passiert mit einem Attribut 'RoutePrefix (" api/models ")' auf Ihrer Controller-Klasse und einem Attribut 'Route (" getallmachines ")' auf Ihrer Methode – Troopers

Antwort

0

Die Frage ist - wie so oft - sehr dumm ... Ich vergaß zu erwähnen, dass ich web.api sowie reguläre mvc benutze. Im Global.asax.cs wurden die mvc Routen zuerst initialisiert, dann die für web.api, dh

 RouteConfig.RegisterRoutes(RouteTable.Routes); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 

statt

 GlobalConfiguration.Configure(WebApiConfig.Register); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 

, die verursacht, dass das Muster api/models/whatever von der Standardroute Config angepasst ist in mvc, dh

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

so die Reihenfolge der Anrufe Wechsel in Global.asax.cs das Problem gelöst. Danke @Joshit

+0

Großartig! Froh, dass ich helfen konnte :) Mit freundlichen Grüßen – Joshit

1

Ich denke, Sie eine neue Route zu Ihrem RouteConfig hinzufügen können.

 `config.Routes.MapHttpRoute(
      name: "DefaultApiWithoutId", 
      routeTemplate: "api/{controller}/{action}/", 
      defaults: null 
     );` 

Diese Route sollte nach der ersten Route platziert werden (weil sie weniger einschränkend ist). Hier ist eine Beschreibung für ein schönes Paket, das es einfacher macht zu überprüfen, welche Routen genommen werden und warum: Route Debugger.

HINWEIS: Bevor Sie etwas freigeben, müssen Sie/deaktivieren routedebugger deinstallieren .. Kann lästige Probleme verursachen ...

+0

Hat nicht funktioniert, aber überprüfen Sie die aktualisierte Frage für weitere Informationen über die Route Debugger. – rst

+0

Ihre Fehlerseite scheint einen Teil des Problems zu enthalten: ASP ordnet Ihren Controller zu api, Ihre Aktion zu Modellen und Ihre ID zuAllMachines zu. Wie ich Sie sehe, ist dies nicht das erwartete Verhalten .. Ich würde empfehlen, dass Sie zuerst versuchen, Ihre URL genau zu Ihrem erwarteten Ergebnis zu finden ... – Joshit

+2

Und noch etwas: Der route-debugger listet die passenden Routen geordnet auf durch die Anrufe, von ASP. Die Reihenfolge der Routen ist wichtig !!! Sie sollten die obige Route vor der Route mit Id hinzufügen ... – Joshit