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

相关问题