是否可以根据查询字符串中的参数值设置Web Api 2路由。
我有以下要求:
/api/controller?data=param.data1 应该去控制器的行动1
/api/controller?data=param.data2 应该去控制者的行动2 任何其他数据值必须转到行动3。
我知道可以选择使用正则表达式设置约束,但我发现的示例适用于通用场景,而不是像我的那样具体。
这是我尝试过的
config.Routes.MapHttpRoute(
name: "test",
routeTemplate: "api/Hub/{data2}",
defaults: new { action = "Test" },
constraints: new { data2 = @"^(param\.data2)$" }
);
有办法吗?也许有更好的方法吗?
重要的是要注意,我无法更改服务的URI。它必须有?data = [value] 这是遗留系统的后备:(
答案 0 :(得分:5)
您可以使用属性路由,这是Web API 2中的新功能。
假设你有以下行为,data
param就是一个字符串:
public Stuff GetStuffForData1(string data) { ... }
public Stuff GetStuffForData2(string data) { ... }
public Stuff GetStuffForData(string data) { ... }
由于您提到regex
,您可以使用正如您在问题 1 中提到的那样使用正则表达式为上述每个操作指定路由约束,例如:
[Route("controller/{data:regex(@"^(param\.data1)$")]
public Stuff GetStuffForData1(string data) { ... }
[Route("controller/{data:regex(@"^(param\.data2)$")]
public Stuff GetStuffForData2(string data) { ... }
// No need for a route constraint for other data params.
public Stuff GetStuffForData(string data) { ... }
一般语法为{parameterName:constraint(params)}
(params
是可选的,不用于所有约束)。在上面的示例中,仅当URI的data
段与 data1 正则表达式匹配时,才会选择第一个路径。同样,如果URI的data
段与 data2 正则表达式匹配,则会选择第二个路径。否则,将选择最后一条路线。
通常,总排序确定如下:
RouteOrder
属性。首先评估较低的值。默认订单值为零。OrdinalIgnoreCase
)排序。您甚至可以通过实现IHttpRouteConstraint
接口并在Register
类的WebApiConfig
方法中注册它来创建自己的自定义路由约束,假设您在IIS上托管,或者如果使用OWIN进行自托管,则使用Configuration
类的Startup
方法。
注意我没有亲自尝试过任何上述内容,但它应该全部工作;至少它应该给你一些想法。有关更多详细信息,包括非常好的示例,您应该首先看一下下面的文章(我在答案中无耻地广泛使用):
1 我真的不是写正则表达式的专家,所以不幸的是我无法就你需要的具体问题向你提出建议。