2016-05-25 13 views
3

In meiner Web-API-Anwendung möchte ich Clients ermöglichen, Anforderungen zu stellen, die den gleichen Pfad verwenden, aber verschiedene Arten von Parametern übergeben.Gleiche URL für überladene Controller-Methoden

Zum Beispiel:

public class MyController : ApiController 
{ 
    [HttpDelete] 
    public IHttpActionResult Delete(int id) {..} 

    [HttpDelete] 
    public IHttpActionResult Delete2(Guid id) {..} 

    [HttpDelete] 
    public IHttpActionResult Delete3(string id) {..} 

} 

Ich mag die URL für jede Methode ähnlich sein, zum Beispiel:

api/MyController/1 
api/MyController/abc etc.. 

Ist das möglich? Ich habe viele Kombinationen mit ActionName Attribut und Routing-Konfiguration versucht, aber nichts schien zu funktionieren.

Dank

+1

Wenn sie alle die gleiche Sache sind, schlage ich vor, eine benutzerdefinierte Klasse (Objekt) zu schaffen jedes dieser (nullable) Eigenschaften zu halten, und unter Verwendung von 1-Route. –

Antwort

6

können Sie attribute routing für diese. Zum Beispiel:

[RoutePrefix("MyController")] 
public class MyController : ApiController 
{ 
    [HttpDelete] 
    [Route("delete/{id:int}")] 
    public IHttpActionResult Delete(int id) {..} 

    [HttpDelete] 
    [Route("delete/{id:guid}")] 
    public IHttpActionResult Delete2(Guid id) {..} 

    [HttpDelete] 
    [Route("delete/{id:alpha}")] 
    public IHttpActionResult  Delete3(string id) {..} 

} 

Wenn Sie dies tun, dann wird die Anfrage-URL sein:

http://yoursever/mycontroller/delete/123 
http://yoursever/mycontroller/delete/abc 
http://yoursever/mycontroller/delete/91c74f8f-d981-4ee1-ba36-3e9416bba202 
+1

Ist dies ein gültiger Fall: * api/MyController/"abc" * ?? – SamGhatak

+0

Sie müssen die Zeichenfolge nicht in Anführungszeichen setzen – Nasreddine

+1

ja das ist, warum ich verwirrt bin, scheint, dass OP will "string" und "int" von * api/MyController/"1" * und * api/MyController/1 unterscheiden * .... – SamGhatak

3

Sie benötigen ein Route mit verschiedenen Parametertypen für jede Ihrer Methoden zur Verfügung zu stellen:

[RoutePrefix("api/MyController")] 
public class MyController : ApiController 
{ 
    [HttpDelete] 
    [Route("{id:int}", Order = 1)] 
    public IHttpActionResult Delete(int id) {..} 

    [HttpDelete] 
    [Route("{id:guid}", Order = 2)] 
    public IHttpActionResult Delete2(Guid id) {..} 

    [HttpDelete] 
    [Route("{id}", Order = 3)] 
    public IHttpActionResult Delete3(string id) {..} 

} 

Natürlich müssen Sie enable attribute routing wenn Sie nicht bereits haben.
Die Order-Eigenschaft für das Route-Attribut stellt sicher, dass die Routenvorlagen in der richtigen Reihenfolge überprüft werden, sodass ein int-Wert nicht mit der Zeichenfolgenroute übereinstimmt.

0

Ja, das ist möglich. Versuchen Sie, die Route als decoration festzulegen.

Beispiel:

 [Route("DeleteThis/{id}")] 
     [HttpDelete] 
     public IHttpActionResult DeleteThis(int id) 
     { 
      return Ok(); 
     } 

     [Route("NowDeleteThis/{name}")] 
     [HttpDelete] 
     public IHttpActionResult DeleteThis(string name) 
     { 
      return Ok(); 
     } 
+0

Wird das nicht die URL ändern? –

+0

Ja, jedoch wird der Methodenname nicht geändert. –

+1

Was ist los mit dem Schrägstrich am Ende der Route? –