基于参数值的Web API 2路由

时间:2014-06-11 21:43:11

标签: asp.net-web-api2

是否可以根据查询字符串中的参数值设置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] 这是遗留系统的后备:(

1 个答案:

答案 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 正则表达式匹配,则会选择第二个路径。否则,将选择最后一条路线。

通常,总排序确定如下:

  1. 比较路由属性的RouteOrder属性。首先评估较低的值。默认订单值为零。
  2. 查看路径模板中的每个URI段。对于每个细分,订购如下:
    1. 文字段。
    2. 使用约束路由参数。
    3. 没有约束的路线参数。
    4. 带有约束的通配符参数段。
    5. 没有约束的通配符参数段。
  3. 如果是平局,则路由按路由模板的不区分大小写的序列比较(OrdinalIgnoreCase)排序。
  4. 您甚至可以通过实现IHttpRouteConstraint接口并在Register类的WebApiConfig方法中注册它来创建自己的自定义路由约束,假设您在IIS上托管,或者如果使用OWIN进行自托管,则使用Configuration类的Startup方法。

    注意我没有亲自尝试过任何上述内容,但它应该全部工作;至少它应该给你一些想法。有关更多详细信息,包括非常好的示例,您应该首先看一下下面的文章(我在答案中无耻地广泛使用):

    1 我真的不是写正则表达式的专家,所以不幸的是我无法就你需要的具体问题向你提出建议。