有条件地调用具有相同 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.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"
}
);
有关详细信息,请参阅 this knowledge base article。
我想创建 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.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"
}
);
有关详细信息,请参阅 this knowledge base article。