0

我想創建2個具有相同URL和Http Verb的動作方法,但是僅根據布爾標誌有條件地將其中一個調用到Web API框架。什麼是實現這一目標的最佳方式?有條件地調用具有相同URL和Http動作的動作方法

[HttpPost] 
    [Route("api/data/{id}")] 
    public HttpResponseMessage PostV1(long id, RequestDTO1 v1) { 

    } 


    [HttpPost] 
    [Route("api/data/{id}")] 
    public HttpResponseMessage PostV2(long id, RequestDTO2 v2) { 

    } 

應該在運行時根據布爾標誌調用PostV1或PostV2。布爾標誌將是特徵標誌或配置標誌。我無法更新網址以包含該標誌。那不在我的控制之下。

+0

你打算準確通過國旗?或者它在配置? –

+0

是的,它是服務器端的功能標誌或配置標誌。我無法更新網址,它不在我的控制之下。 – govin

+0

你可以對'RequestDTO1'和'RequestDTO2'使用繼承嗎? –

回答

2

如果版本是由在啓動時讀取配置交換機控制,你可以從你的行動方法去除RouteAttribute和,而不是定義路由你global.asax.csApp_Start\RouteConfig.cs(或者不管它是您的站點使用)。在不同情況下使用簡單的if條件來定義不同的路由。

if (configSwitch) 
{ 
    routes.MapRoute(
     "Custom", 
     "api/data/{id}", 
     new { 
       controller = "MyController", 
       action = "PostV1" 
      } 
    ); 
} 
else 
{ 
    routes.MapRoute(
     "Custom", 
     "api/data/{id}", 
     new { 
       controller = "MyController", 
       action = "PostV2" //Notice the version difference 
      } 
    ); 
} 

或(略短):

routes.MapRoute(
    "Custom", 
    "api/data/{id}", 
    new { 
      controller = "MyController", 
      action = configSwitch ? "PostV1" : "PostV2" 
     } 
); 

更多信息請參見this knowledge base article

+0

這將工作,任何機會可以通過屬性路由完成? – govin

+1

不適用於默認實現。您無法擴展'RouteAttribute',因爲它是密封的,並且默認不瞭解您的配置開關。但是,您可以擴展[UrlRoutingModule](https://msdn.microsoft.com/en-us/library/system.web.routing.urlroutingmodule(v = vs.110).aspx),並在其中放入任何您想要的邏輯。 –

1

我認爲「標誌」是在URL中發送的,是嗎?那麼爲什麼不把它放在路線上呢?

[HttpPost] 
[Route("api/data/v1/{id}")] 
public HttpResponseMessage PostV1(long id, RequestDTO1 v1) { 

} 


[HttpPost] 
[Route("api/data/v2/{id}")] 
public HttpResponseMessage PostV2(long id, RequestDTO2 v2) { 

} 
+0

我以同樣的思路思考,但OP堅持路線應該保持不變。 – Nkosi

+0

該標誌未在URL中發送。該標誌將成爲服務器端的功能標誌或配置標誌。我無法更新網址,它不在我的控制之下。 – govin

相關問題