Условно вызвать методы действия с тем же 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) {
}