是否可以根据查询字符串中的参数值设置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]这是旧版系统的后备功能:(
您可以使用Web API 2中新增的Attribute Routing。
假设您执行以下操作,其中data
参数是一个字符串:
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
是可选的,并不用于所有约束)。在上面的示例中,仅当data
URI的段与data1正则表达式匹配时,才会选择第一个路由。同样,如果data
URI的段与data2正则表达式匹配,则将选择第二条路由。否则,将选择最后一条路线。
通常,总排序确定如下:
RouteOrder
route属性的属性。较低的值将首先评估。默认订单值为零。OrdinalIgnoreCase
路由模板的不区分大小写的序数字符串比较()来对路由进行排序。您甚至可以通过实现IHttpRouteConstraint
接口并在类的Register
方法中WebApiConfig
(假定您在IIS上进行托管)或在使用OWIN进行自托管的类的Configuration
方法中进行注册,来创建自己的自定义路由约束Startup
。
请注意,我还没有亲自尝试上述任何方法,但是应该都能使用。至少它应该给您一些想法。有关更多详细信息(包括非常好的示例),您应该首先查看以下文章(我在回答中无耻地广泛使用了该文章):
1我真的不是编写正则表达式的专家,因此很遗憾,我无法为您提供所需的具体建议。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句