6

Tôi đã thiết lập dự án api web asp.net (nó hoạt động chính xác giống như Dự án Mvc) sử dụng định tuyến - vì vậy tôi cóAsp.net MVC/Định tuyến Api Web: Cần định tuyến một chút khác nhau

sau đây
routes.MapHttpRoute(
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Vì vậy, mọi thứ hoạt động theo cách tôi muốn .... Tôi nhập api/Sản phẩm/15 nó đến trong Bộ điều khiển Sản phẩm của tôi đi qua 15 làm id.

Tuyệt vời.

Tôi cũng có 2 bộ điều khiển khác, 1 được gọi là UploadsController và 1 được gọi là DownloadsController. Những cung cấp lên và đường xuống (GET/PUT vv)

Bây giờ tôi không muốn họ được đón bởi sự cai trị ban đầu (xem ở trên)

Nhưng những gì tôi muốn là sử dụng những 2 url truy cập chúng

/api/Giao thông vận tải/Uploads/15 /api/Giao thông vận tải/Downloads/15

tôi đã được thông qua năm 15 như ID, có lẽ sẽ không xảy ra trong thực tế đời sống ... chỉ cần tốt của nó để trình diễn :-)

Bây giờ Giao thông vận tải d oesn't tồn tại vì vậy tôi có thể làm như sau

routes.MapHttpRoute(
    name: "API Default", 
    routeTemplate: "api/Transports/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

mà tôi tin rằng công trình ...

nhưng vấn đề là nếu tôi làm

/api/Uploads/15 - điều này cũng sẽ được đánh bắt bởi các quy tắc ban đầu mà tôi không muốn ..

tôi muốn tải lên và tải điều khiển để được truy cập thông qua giả "bay vận tải" và không phải không có những Transports

Có ai giúp được không?

Cảm ơn trước

Trả lời

18

Bạn có thể sử dụng route constraints và xác định các tuyến đường 2 API theo thứ tự sau:

// matches /api/transports/downloads/id or /api/transports/uploads/id only 
// and no other possible controller 
routes.MapHttpRoute(
    name: "API Transport", 
    routeTemplate: "api/transports/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional }, 
    constraints: new { controller = "uploads|downloads" } 
); 

// matches anything in the form /api/{controller}/id where {controller} 
// could be anythnig different than "downloads" or "uploads" because we don't 
// want to allow the following urls: /api/downloads/id and /api/uploads/id 
routes.MapHttpRoute(
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional }, 
    constraints: new { controller = @"^((?!(downloads|uploads)).)*$" } 
); 
+0

nhờ, đó là tuyệt vời. – Martin

+0

nhiều upvotes nếu tôi có thể :) –

Các vấn đề liên quan