2016-06-01 4 views
1

私は以下のように私のWeb APIコントローラに5つのアクションを持っています。web apiすべてのアクションのための単一のカスタムルーティング

http://localhost:1234/productsからsaveproductアクション(ポスト)
http://localhost:1234/products/1/getcolor - - getproductcolorbyidアクション
http://localhost:1234/products/1/getcostからgetproductnyidアクション
http://localhost:1234/productsマップする - getallproductアクション
http://localhost:1234/products/1マップするgetproductcostbyidアクション

を私は一つだけカスタムを必要としますこれをルーティングするURL。

私は以下のルーティングを試しましたが、私は望まないURL(http://localhost:24007/product/GetProductByID/Id)にアクション名を追加しています。

[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) 
    { 
     //... 
    } 
} 

そして、あなたのHttpConfigurationオブジェクトに登録することを忘れないでください:として

config.MapHttpAttributeRoutes(); 

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

答えて

1

あなたはこのような柔軟性が必要な場合はルーティング属性を使用する必要があります私はあなたにRPC-lを使わないように強く勧めます。あなたのURI(例えば、決してgetcolorgetcost)のようなURIセグメントを使用しませんが、RESTの制約に準拠して名前を使用します。

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

これはあなたのRouteAttribute Sを変えることによって達成することができます。

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

感謝を。要件に応じて、属性ルーティングを使用しないでください。 –

+0

私は他のオプションがないことを恐れています。 –

+0

getcolors、getcostなどのURLを使用しない理由を説明してください。 –

関連する問題