Web API 2基于参数值的路由

罗曼·米克(Roman Mik)

是否可以根据查询字符串中的参数值设置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是可选的,并不用于所有约束)。在上面的示例中,仅当dataURI段与data1正则表达式匹配时,才会选择第一个路由同样,如果dataURI段与data2正则表达式匹配,则将选择第二条路否则,将选择最后一条路线。

通常,总排序确定如下:

  1. 比较RouteOrderroute属性的属性。较低的值将首先评估。默认订单值为零。
  2. 查看路由模板中的每个URI段。对于每个细分,请按以下顺序订购:
    1. 文字细分。
    2. 路由具有约束的参数。
    3. 路由参数无限制。
    4. 带约束的通配符参数段。
    5. 无约束的通配符参数段。
  3. 如果是平局,则通过OrdinalIgnoreCase路由模板的不区分大小写的序数字符串比较()来对路由进行排序

您甚至可以通过实现IHttpRouteConstraint接口并在Register方法中WebApiConfig(假定您在IIS上进行托管)或在使用OWIN进行自托管的类Configuration方法中进行注册,来创建自己的自定义路由约束Startup

请注意,我还没有亲自尝试上述任何方法,但是应该都能使用。至少它应该给您一些想法。有关更多详细信息(包括非常好的示例),您应该首先查看以下文章(我在回答中无耻地广泛使用了该文章):

1我真的不是编写正则表达式的专家,因此很遗憾,我无法为您提供所需的具体建议。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章