Условно вызвать методы действия с тем же URL и глаголом Http

Я хотел бы создать 2 метода действия с одним и тем же URL и глаголом Http, но условно вызывать только один из них в инфраструктуру 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 ответа

Решение

Если версия управляется переключателем конфигурации, который читается во время запуска, вы можете удалить RouteAttribute из ваших методов действия и вместо этого определить маршрутизацию в вашем global.asax.cs или же App_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"
         }
);

См. Эту статью базы знаний для получения дополнительной информации.

Я предполагаю, что "флаг" отправляется в 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) {

}
Другие вопросы по тегам