有条件地使用相同的URL和Http Verb调用操作方法

时间:2017-08-01 23:56:33

标签: c# asp.net asp.net-web-api asp.net-web-api2 attributerouting

我想创建具有相同URL和Http Verb的2个操作方法,但是有条件地仅基于布尔标志调用其中一个到Web API框架。实现这一目标的最佳方法是什么?

    [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。布尔标志将是功能标志或配置标志。我无法更新包含该标志的URL。这不在我的控制之下。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我假设"标志"在URL中发送,是吗?那么为什么不把它放在路线上呢?

if($request->hasFile('file'))