2016-08-10 4 views
0

Ich kann nicht scheinen, eine Antwort auf diese Frage zu finden, also poste ich es hier. Dies kann eine grundlegende Routing-Frage sein und vielleicht fehlt mir gerade etwas Offensichtliches. Ich habe ein WebAPI2-Projekt, das GetAll() -Methode in dem Controller hat. Ich verwende Attribut-Routing einschließlich eines RoutePrefix. Wenn ich die Methode mit Postman teste, funktioniert es einwandfrei http://localhost/api/v1/Suppressions und es gibt eine Liste von JSON aus meiner Mongo DB-Sammlung zurück. Zufällig während des Tests habe ich zufällig einen Parameter getestet und der URL hinzugefügt, dass ich einen Fehler "Die Ressource kann nicht gefunden werden" erhalten würde http://localhost/api/v1/Suppressions?name=abc, aber stattdessen die GetAll() Methode aufgerufen.WebAPI und Attribut-Routing

Während des Routings werden Parameter ignoriert und nur die URI verwendet (außer natürlich, ich habe eine Methode, die die Parameter wie Get (String-Name) genannt)? Wenn das der Fall ist, gibt es eine Route-Einschränkung, die ich meiner GetAll() -Methode hinzufügen muss, um den Fehler "die Ressource nicht gefunden werden" zu werfen, wenn jemand versehentlich die Methode mit einem Parameter oder einer Liste von Parametern aufgerufen?

Antwort

0

Abfrageparameter werden im Routing ignoriert, sofern sie nicht im Uri angegeben sind. Sie können entweder eine separate Route für "Suppressions? Name = {name}" hinzufügen oder sie in Ihrem bestehenden Anruf bearbeiten.

Informationen zu passenden Uri finden Sie unter: UriTemplate.Match

+0

Danke für die Antwort. Frage aber, wie würde ich es in meinem bestehenden Anruf behandeln, wenn meine Methode GetAll() Parameter nicht akzeptiert? Wie würde ich wissen, dass der Benutzer die API mit Parametern aufgerufen hat, wenn der Arbeitsplan denkt, dass es in Ordnung ist? – user2337213

+0

Sie können den Abfrageparameterwert mithilfe von [HttpContext.Current.Request.QueryString] (https://msdn.microsoft.com/en-us/library/system.web.httprequest.querystring (v = vs.110) abrufen. aspx). – returnsvoid

+1

Ah, richtig. Danke für Ihre Hilfe! Beide Antworten waren hilfreich, aber ich akzeptiere diese Antwort aufgrund der Antwort, die besagt, dass Abfrageparameter beim Routing ignoriert werden, was die ursprüngliche Frage beantwortet. Und die Erinnerung, dass ich HttpContext.Current.Request.QueryString verwenden kann, um die Parameter abzurufen und 404 zurückgeben, falls gewünscht. – user2337213

0

Es hängt davon ab.

Nehmen wir an, Sie haben eine Methode wie die, die Sie beschreiben. Beispiel:

[RoutePrefix("api")] 
public class api: ApiController { 
    [HttpGet] 
    [Route("Supressions")] 
    public HttpResponseMessage GetAll(HttpRequestMessage request){ 
     ///etc 
    } 
} 

Diese Methode wird unabhängig von den verwendeten Parametern aufgerufen.

Wenn Sie jedoch so etwas wie dieses

[RoutePrefix("api")] 
public class api: ApiController { 
    [HttpGet] 
    [Route("Supressions/{abc}")] 
    public HttpResponseMessage Get(HttpRequestMessage request, string abc){ 
     ///etc 
    } 
} 

tun Sie den Parameter benötigen. Wenn Sie es nicht haben, und Sie http://localhost/api/Suppressions nennen, wird es so etwas wie dies zurück:

{ 
"message": "No HTTP resource was found that matches the request URI 'http://localhost:64307/api/Suppressions'.", 
"messageDetail": "No type was found that matches the controller named ''." 
} 

Nun, wenn Sie mehrere Parameter haben, können Sie so etwas wie dies tun können, und wenn Sie benutzen sie nicht in Ihr Anruf, es wird auch

[RoutePrefix("api")] 
public class api: ApiController { 
    [HttpGet] 
    [Route("Supressions")] 
    public HttpResponseMessage Get(HttpRequestMessage request, string abc, int id, int somethingElse){ 
     ///etc 
    } 
} 

Hier wird der Anruf so etwas zu beklagen wäre:

http://localhost:64307/api/Suppressions?abc=asdas&id=13&somethingElse=45

Hoffnung thi s helfen Ihnen zu verstehen

+0

Danke für Ihre Antwort.In diesem Szenario, in dem es nur eine Methode in einem Controller gibt, die parameterlos ist, gibt es in der Regel eine Routenbeschränkung oder etwas, das der Methode hinzugefügt werden muss, um zu überprüfen, ob der Aufruf korrekt an die Methode weitergeleitet wurde oder nicht Wenn der Benutzer aus irgendeinem Grund versehentlich Parameter für die Abfragezeichenfolge hinzugefügt hat, ruft er einfach GetAll() auf und gibt alles zurück, und sie beheben es an ihrem Ende? – user2337213

+0

Kein Problem. Warum könnte der Benutzer die Abfragezeichenfolge ändern? Wurde das nicht von Ihrem Front-End-Routing-Framework gehandhabt? Ich bin mir nicht bewusst, ob es eine Einschränkung dafür gibt. –

+0

Sie haben Recht, das Frontend wird die Methode niemals mit Parametern aufrufen. Bei der Verwendung von Postman war es eher eine Frage des QA-Tests. Danke für Ihre Hilfe! – user2337213