2016-06-01 10 views
1

Ich habe fünf Aktionen in meinem Web-API-Controller wie folgt.web api single benutzerdefinierte Routing für alle Aktionen

http://localhost:1234/products - getallproduct Aktion
http://localhost:1234/products/1 zur Karte - zur Karte getproductnyid Aktion
http://localhost:1234/products-saveproduct Aktion (post)
http://localhost:1234/products/1/getcolor-getproductcolorbyid Aktion
http://localhost:1234/products/1/getcost-getproductcostbyid Aktion

Ich brauche nur eine benutzerdefinierte Routing-URL dafür.

Ich habe folgenden Routing versucht, aber es hängt Action Name in URL (http://localhost:24007/product/GetProductByID/Id), die ich nicht will.

config.Routes.MapHttpRoute(
    name: "ProductRoute", 
    routeTemplate: "product/{action}/{productId}", 
    defaults: new { controller = "Product", productId= RouteParameter.Optional } 
); 

Antwort

1

Sie haben Routing verwenden Attribut, wenn Sie diese Art von Flexibilität wünschen:

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

    [HttpGet] 
    [Route("")] 
    public IHttpActionResult GetAllProduct() 
    { 
     //... 
    } 

    [HttpGet] 
    [Route("{productId}")] 
    public IHttpActionResult GetProductById(int id) 
    { 
     //... 
    } 

    [HttpPost] 
    [Route("")] 
    public IHttpActionResult SaveProduct(Product product) 
    { 
     //... 
    } 

    [HttpGet] 
    [Route("{productId}/getcolor")] 
    public IHttpActionResult GetProductColorById(int id) 
    { 
     //... 
    } 

    [HttpGet] 
    [Route("{productId}/getcost")] 
    public IHttpActionResult GetProductCostById(int id) 
    { 
     //... 
    } 
} 

Und denken Sie daran, sie in Ihrem HttpConfiguration Objekt registrieren:

config.MapHttpAttributeRoutes(); 

Als Übrigens: Wenn Sie eine RESTful-API entwickeln (was mir scheint), rate ich dringend davon ab, die Verwendung von RPC-l zu vermeiden Aktionen in Ihren URIs (z. nie URI Segmente wie getcolor, getcost) verwenden, aber Namen verwenden, die mit REST Einschränkungen entspricht:

http://localhost:1234/products/1/color 
http://localhost:1234/products/1/cost 

Dies, indem Sie Ihre RouteAttribute s erreicht werden kann:

[Route("{productId}/color")] 
//... 
[Route("{productId}/cost")] 
+0

Dank. Gemäß der Anforderung sollten wir nicht Attribut-Routing verwenden –

+0

Ich fürchte, Sie haben dann keine anderen Optionen. –

+0

Können Sie bitte erklären, warum URLs wie getcolors, getcost nicht verwenden sollten? –

Verwandte Themen