C# 使用相同的URL和Http谓词有条件地调用操作方法

C# 使用相同的URL和Http谓词有条件地调用操作方法,c#,asp.net,asp.net-web-api,asp.net-web-api2,attributerouting,C#,Asp.net,Asp.net Web Api,Asp.net Web Api2,Attributerouting,我想创建两个具有相同URL和Http谓词的操作方法,但基于布尔标志,仅有条件地将其中一个调用到Web API框架。实现这一目标的最佳方式是什么 [HttpPost] [路由(“api/data/{id}”)] 公共HttpResponseMessage PostV1(长id,RequestDTO1 v1){ } [HttpPost] [路由(“api/data/{id}”)] 公共HttpResponseMessage PostV2(长id,RequestDTO2 v2){ } 在运行时,应基

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

[HttpPost]
[路由(“api/data/{id}”)]
公共HttpResponseMessage PostV1(长id,RequestDTO1 v1){
}
[HttpPost]
[路由(“api/data/{id}”)]
公共HttpResponseMessage PostV2(长id,RequestDTO2 v2){
}
在运行时,应基于布尔标志调用PostV1或PostV2。布尔标志将是功能标志或配置标志。我无法更新URL以包含该标志。那不在我的控制之下

我假设“标志”是在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\u 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
             }
    );
}
或(略短):


有关更多信息,请参阅。

我的想法与此相同,但OP坚持路由应保持不变。URL中不发送该标志。该标志将是服务器端的功能标志或配置标志。我无法更新URL,它不在我的控制之下。您打算在哪里传递该标志?或者它在配置中?是的,它是服务器端的功能标志或配置标志。我无法更新URL,它不在我的控制范围内。您可以对
RequestDTO1
RequestDTO2
使用继承吗?@govin您找到解决方案了吗?我有一个与功能标志类似的场景。功能标志包含的逻辑最终取决于请求上下文中的信息,因此所讨论的“布尔值”必须是某种可以访问请求上下文的钩子。这将起作用,有可能通过属性路由实现吗?而不是默认实现。您无法扩展
RouteAttribute
,因为它是密封的,并且默认设置对您的配置开关一无所知。但是你可以扩展,把你想要的逻辑放进去。
routes.MapRoute(
    "Custom",
    "api/data/{id}",
     new { 
             controller = "MyController", 
             action = configSwitch ? "PostV1" : "PostV2"
         }
);