6

我已經設置了一個asp.net web api項目(它的工作原理與Mvc項目完全一樣)使用路由 - 因此我有以下Asp.net MVC/Web Api路由:需要路由有點不同

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

所以一切都按我想要的方式工作....我輸入api/Products/15它到達我的產品控制器中傳入15作爲id。

太好了。

我也有2個控制器,1個稱爲UploadsController,1個稱爲DownloadsController。這些提供上載和下載(GET/PUT等)

現在我不希望他們被原來的規則有所回升(見上文)

但我想是使用這2個網址,訪問它們

/API /運輸/上傳/ 15 /API /運輸/下載/ 15

我已經15通過作爲ID,可能不會發生在現實生活...只是其良好示範:-)

Now運輸d oesn't存在,所以我可以做以下

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

,我相信作品...

但問題是,如果我

/API /上傳/ 15 - 這也將由我不想對原規則..

我想要的上傳和下載控制器通過僞造「交通服務」,而不是無交通服務的訪問被抓

任何人都可以幫忙嗎?

在此先感謝

回答

18

您可以按以下順序使用route constraints和定義2 API路線:

// 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

謝謝,那是很大的。 – Martin

+0

多個upvotes,如果我可以:) –