有条件地调用具有相同 URL 和 Http 动词的操作方法

Conditionally invoke action methods with same URL and Http Verb

我想创建 2 个具有相同 URL 和 Http Verb 的操作方法,但基于布尔标志有条件地仅将其中一个调用到 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。布尔标志将是功能标志或配置标志。我无法更新 URLs 以包含该标志。那不在我的控制之下。

我假设 "flag" 是在 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) {

}

如果版本由启动时读取的配置开关控制,您可以从操作方法中删除 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