Abfragezeichenfolge funktioniert nicht, während Attributrouting verwendet wird
Ich bin mit System.Web.Http.RouteAttribute
und System.Web.Http.RoutePrefixAttribute
zu ermöglichen sauberere URLs für meine Web API 2 Anwendung. Für die meisten meiner Anfragen, die ich verwenden kann-routing (zB. Controller/param1/param2
) oder ich kann verwenden Sie query-strings (zB. Controller?param1=bob¶m2=mary
).
Leider mit einem meiner Controller (und nur eine), diese schlägt fehl. Hier ist mein Controller:
[RoutePrefix("1/Names")]
public class NamesController : ApiController
{
[HttpGet]
[Route("{name}/{sport}/{drink}")]
public List<int> Get(string name, string sport, string drink)
{
//Code removed...
}
[HttpGet]
[Route("{name}/{drink}")]
public List<int> Get(string name, string drink)
{
//Code removed...
}
}
Wenn ich eine Anfrage entweder über routing, funktionieren beide gut. Allerdings, wenn ich einen query-string, versäumt es, mir zu sagen, dass dieser Pfad nicht existiert.
Habe ich versucht, indem Sie das folgende zu meinem WebApiConfig.cs
Klasse' Register(HttpConfiguration config)
- Funktion (vor und nach der Default-route), aber es half nichts:
config.Routes.MapHttpRoute(
name: "NameRoute",
routeTemplate: "{verId}/Names/{name}/{sport}/{drink}",
defaults: new { name = RouteParameter.Optional, sport = RouteParameter.Optional, drink = RouteParameter.Optional },
constraints: new { verId = @"\d+" });
Also für die Klarheit, ich möchte in der Lage sein, beides zu tun:
localhost:12345/1/Names/Ted/rugby/coke
localhost:12345/1/Names/Ted/coke
und
localhost:12345/1/Names?name=Ted&sport=rugby&drink=coke
localhost:12345/1/Names?name=Ted&drink=coke
aber leider ist der query-string-Versionen funktionieren nicht! 🙁
Aktualisiert
Habe ich entfernt, die zweite Aktion zusammen und versucht nun, die Verwendung von nur einer einzigartigen Aktion mit optionalen Parametern. Ich habe mich verändert meine route Attribut [Route("{name}/{drink}/{sport?}")]
als Tony vorschlug, sport machen null-Werte zulässt, aber dies jetzt verhindert localhost:12345/1/Names/Ted/coke
wird eine gültige route aus irgendeinem Grund. Query-strings sind gleich Verhalten wie zuvor.
Update 2
Ich habe jetzt eine einzigartige Aktion in meinem controller:
[RoutePrefix("1/Names")]
public class NamesController : ApiController
{
[HttpGet]
[Route("{name}/{drink}/{sport?}")]
public List<int> Get(string name, string drink, string sport = "")
{
//Code removed...
}
}
aber immer noch, mithilfe von query strings nicht finden einen geeigneten Weg, während der Verwendung der routing-Methode.
InformationsquelleAutor der Frage Chris Paton | 2014-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich vor dem gleichen Problem " Wie such-Parameter als query-string?', während ich versuchte, zu bauen eine web-api für mein Aktuelles Projekt. Nach googeln, die folgenden arbeiten gut für mich:
Api-controller Aktion:
Die url habe ich versucht durch Postboten:
InformationsquelleAutor der Antwort Mosharaf Hossain
Nach viel mühsame tüfteln und Googeln, habe ich mit einem 'fix'. Ich weiß nicht, ob das ideal ist/best practice/plain old falsch, aber es löst mein Problem.
Alles, was ich Tat, war fügen Sie
[Route("")]
neben der route Attribute ich war ja schon mit. Dies ist im Grunde mit der Web-API-2-routing zu ermöglichen, query-strings, wie ist das nun eine gültige Route.Ein Beispiel wäre jetzt:
Dies macht sowohl
localhost:12345/1/Names/Ted/coke
undlocalhost:12345/1/Names?name=Ted&drink=coke
gültig.InformationsquelleAutor der Antwort Chris Paton
Mit dem Attribut-routing müssen Sie angeben, default-Werte, so dass Sie wäre optional.
Zuweisung eines Wertes erlauben es optional sein, so dass Sie nicht haben, um es aufzunehmen, und es wird übergeben Sie den Wert angeben.
Habe ich nicht getestet, der Abfragezeichenfolge für dieses, aber es sollte die gleiche Arbeit.
Ich nur wieder Lesen die Frage, und ich sehe, dass Sie 2 Bekommen Verben mit dem gleichen Pfad, ich glaube, das würde zu Konflikten führen, wie routing würde nicht wissen, welches man nutzen, vielleicht mit der optionalen params helfen. Sie können auch angeben, man kann null sein, und eine überprüfung in der Methode, wie es weiter gehen wird.
Dann überprüfen Sie die Variablen in der Methode zu sehen, ob Sie null sind und zu handhaben, wie gebraucht.
Hoffe, das hilft, einige? lol
Wenn nicht vielleicht diese Website, es hat mehr details über Attribut-routing.
http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
Clip von dieser site:
InformationsquelleAutor der Antwort Tony
Nur eine Randnotiz aus meinem Teil auch. Um für die queryString-Parametern zu arbeiten, müssen Sie einen default-Wert für die Methode Parameter, um es optional. So wie Sie auch tun würde, wenn Sie normalerweise den Aufruf einer C# - Methode.
Dies ermöglicht es mir, rufen Sie den Endpunkt wie diese:
InformationsquelleAutor der Antwort Juri
Mit
Route("search/{categoryid=categoryid}/{ordercode=ordercode}")
denen beide Abfragezeichenfolgen-und inline-route Parameter wie beantwortet mosharaf hossain. Schreiben Sie diese Antwort wie top-Antwort und beste Weg. MitRoute("")
wird Probleme verursachen, wenn Sie mehrere Gets/Puts/Posts/Löscht.InformationsquelleAutor der Antwort bhargav kishore mummadireddy
Hier ist eine leichte abweichend von @bhargav kishore mummadireddy ist Antwort, aber eine wichtige Abweichung. Seine Antwort wird standardmäßig die querystring-Werten zu einer tatsächlichen nicht-leeren Wert. Diese Antwort wird standardmäßig, Sie zu leeren.
Es ermöglicht Ihnen das aufrufen des Controllers durch path-routing, oder verwenden Sie die querystring. Im wesentlichen, es definiert den default-Wert der querystring zu leeren, das heißt, es wird immer geroutet werden.
Dies war mir wichtig, denn ich möchte zurückkehren, 400 (Bad Request) wenn ein querystring ist nicht angegeben, anstatt ASP.NET Rückkehr der "nicht finden konnte, diese Methode auf diesem controller" Fehler.
InformationsquelleAutor der Antwort contactmatt
Da haben Sie
[Route("{name}/{drink}/{sport?}")]
als Attribut-routing, dieser code wird nie erreicht werden.Also nur das Attribut route
[Route("{name}/{drink}/{sport?}")]
wird geehrt hier. Da Ihre Anfragelocalhost:12345/1/Names?name=Ted&sport=rugby&drink=coke
nicht Namen -, sport-oder trinken in der URL ist es nicht passend zu diesem Attribut route. Betrachten wir die query-string-Parameter bei der Anpassung der Routen.Um dieses Problem zu lösen, müssen Sie alle 3 optional in Ihrem Attribut route. Dann wird es die Anforderung übereinstimmt.
InformationsquelleAutor der Antwort mugdhak
Benutze ich FromUri Attribut als Lösung
InformationsquelleAutor der Antwort Vasil Galinovsky