2016-07-07 8 views
1

Ich verwende WebAPI 2.2, attributbasiertes Routing und ich kann nicht herausfinden, warum Abfragezeichenfolgen nicht funktionieren oder wie sie aktiviert werden. Ich habe andere SO-Fragen dazu gelesen, aber sie haben sich nicht ganz auf mich übertragen.WebAPI 2.2, Attributbasiertes Routing und Abfragezeichenfolgen

Hier ist eine wirklich einfache APIController:

[Route("api/HelloMessage")] 
public async Task<IHttpActionResult> Get() 
{ 
    var result = await Task.FromResult(new string[] { "Hello", "World" }).ConfigureAwait(false); 
    return Ok(result); 
} 

[Route("api/HelloMessage/{id}")] 
public async Task<IHttpActionResult> Get(int id) 
{ 
    var result = await Task.FromResult($"Hello {id}").ConfigureAwait(false); 
    return Ok(result); 
} 

(auch, um WebApiConfig.cs gehen, und kommentieren Sie die Standardroute aus, die mit MapHttpRoute erstellt wird)

Wenn ich es mit http://localhost/api/HelloMessage/1 getroffen, es funktioniert super.

Allerdings, wenn ich es mit http://localhost/api/HelloMessage?id=1 traf, bindet es sich an die parameterlose Version. Wo gehe ich falsch?

Eine seltsame Sache:

Wenn ich den MapHttpRoute Code erneut aktiviert, dann die Routing-Werke (so id = 1 Routen zur parametrisierte Methode?).

Ich möchte wissen, warum dies nicht funktioniert mit Attribut-based Routing obwohl. Ist das ein Fehler, oder mache ich es einfach falsch?

hier ist der MapHttpRoute Code, es funktioniert wird:

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

Antwort

1

Das ist von Entwurf. Das standardmäßige konventionsbasierte Routing würde eine Route wie api/{controller}/{id} zu Ihrer parameterlosen Aktion zuordnen, da {id} optional ist, wie von defaults: new { id = RouteParameter.Optional } angegeben.

Mit Attributrouting haben Sie jedoch mehr Kontrolle und Flexibilität über den Routing-Prozess.

Zum Beispiel in Attribut-Routing Sie können id wie diese

[Route("api/HelloMessage/{id?}")] 
public async Task<IHttpActionResult> Get(int id) {...} 

optional machen, aber das würde einen Konflikt mit der ersten Route, wie sie jetzt beide Spiel api/HelloMessage verursachen.

Wenn Sie http://localhost/api/HelloMessage?id=1 arbeiten möchten, indem Sie die ID aus der uri abrufen, dann müssen Sie zuerst die Aktion entfernen, die den Parameter nicht vorhanden ist oder es ist die Route ändern, es deutlich und machen die anderen Maßnahmen der id optional zu machen.

Der Frame-Arbeit wird die ?id=1 im URI mit dem Parameter übereinstimmen und den Wert an den Parameter übergeben.

+0

Danke Nkosi. Ich finde es wirklich seltsam, dass das Verhalten, das Sie mit HttpMapRoute() erhalten, sich so sehr von dem Verhalten unterscheidet, das Sie mit dem attributbasierten Routing bekommen. Ich frage mich, warum sie sie so anders funktionieren ließen. – JMarsch

+0

Ich glaube, ich habe irgendwo gelesen, dass verschiedene Teams an den MVC- und Web-Api-Frameworks arbeiten. Sie können ähnliche Funktionalität teilen, aber unter der Haube wurde es anders entwickelt. Es wurde schließlich zu einer gemeinsamen Version in der vNext-Version verschmolzen, die schließlich asp-Punkt-Netzkern wurde. – Nkosi

Verwandte Themen