1

Ich habe diese Konfiguration in der HttpConfigurationWie Web api Route auf dem gleichen Verfahren mit Anmerkungen

config.Routes.MapHttpRoute("Default", "api/{controller}"); 
config.Routes.MapHttpRoute("Another", "api/{controller}/{action}"); 
config.Routes.MapHttpRoute("WithKey", "api/{controller}/{action}/{key}"); 

Aus diesem Grund außer Kraft zu setzen ich nicht mein Controller wie diese

http://<host>/api/products (works) 
http://<host>/api/products/1 (doesn't work) 

So hinzugefügt

zugreifen kann ich die Anmerkung Route in der Get-Methode, aber es funktioniert nicht

[RoutePrefix("products")] 
public class ProductsController : ApiController 
{ 

    [HttpGet] 
    public IQueryable<IProduct> GetProducts() 
    { 
     return db.GetProducts(); 
    } 

    //[Route("products/{productID}")] Tried. Doesn't work 
    //[Route("{productID:int}")] Tried. Doesn't work 
    [HttpGet] 
    public IProduct GetProduct(int productID) 
    { 
     return db.GetProduct(productID); 
    } 
} 

Der einzige Weg, um es zu arbeiten ist die Adresse wie folgt eingeben http://<host>/api/products?productID=1, aber ich möchte wirklich mit dieser URL http://<host>/api/products/1 zugreifen.

Ich kann neue Routen in der http-Konfiguration hinzufügen, aber die vorhandenen nicht ändern. Und ich möchte die vorhandenen Controller nicht beeinflussen.

Wie kann ich das bitte lösen?

Antwort

0

Stellen Sie zunächst sicher, dass das Attribut Routing vor konventionsbasierten Routen aktiviert ist.

config.MapHttpAttributeRoutes(); 
//...convention-based routes. 
config.Routes.MapHttpRoute("Default", "api/{controller}"); 
//...other code removed for brevity 

Als nächstes möchten Sie die Attribute Routen aktualisieren.

[RoutePrefix("api/products")] 
public class ProductsController : ApiController { 
    //GET api/products 
    [HttpGet] 
    [Route("")] 
    public IQueryable<IProduct> GetProducts() { 
     return db.GetProducts(); 
    }  

    //GET api/products/1 
    [HttpGet] 
    [Route("{productID:int}")] 
    public IProduct GetProduct(int productID) { 
     return db.GetProduct(productID); 
    } 
} 
+0

Danke für Ihre Antwort. Ich habe MapHttpAttributRoutes() angewendet. Dann fügte ich die Anmerkungen hinzu. Ich kann nur GetProducts anfordern, aber ich kann immer noch nicht die API/products/1 bekommen. Nachricht, die ich erhalte: "{" Message ":" Es wurde keine HTTP-Ressource gefunden, die mit der Anfrage-URI übereinstimmt "http: // /api/products/1'.","MessageDetail":"Auf dem Controller wurde keine Aktion gefunden ' Produkte, die der Anfrage entsprechen. "}" –

+0

@MaximusDecimus, Haben Sie es vor konventionsbasierten Routen hinzugefügt, wie in der Antwort vorgeschlagen? – Nkosi

+0

Ja, ich habe das gleiche als Antwort –

Verwandte Themen