【问题标题】:Web API 2 Routing based on Parameter's ValueWeb API 2 基于参数值的路由
【发布时间】:2019-05-24 18:46:27
【问题描述】:

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

【问题讨论】:

  • Roman,你能做到吗? stackoverflow.com/questions/21589011/… 暗示它实际上是不可能的,但它引用的页面 (attributerouting.net/#asp-net-web-api) 已经离线几天了,所以我自己无法阅读上下文。我确实在下面尝试了 djikay 的建议,但它对我不起作用。
  • @shanon 不幸的是,djikay 的建议对我也不起作用。我最终编写了一个接受所有请求的控制器,然后根据 ?data= 中的值将它们分派给适当的操作。这是一个丑陋的开关{},但这是我当时能想到的唯一方法。

标签: asp.net-web-api2


【解决方案1】:

您可以使用 Web API 2 中的新功能 属性路由

假设您有以下操作,其中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 是可选的,并非用于所有约束)。在上面的示例中,只有当 URI 的 data 段与 data1 正则表达式匹配时,才会选择第一个路由。同样,如果 URI 的 data 段与 data2 正则表达式匹配,则将选择第二条路由。否则,将选择最后一条路线。

一般来说,总排序是这样确定的:

  1. 比较路由属性的RouteOrder 属性。首先评估较低的值。默认订单值为零。
  2. 查看路由模板中的每个 URI 段。对于每个段,顺序如下:
    1. 文字段。
    2. 带约束的路由参数。
    3. 无约束路由参数。
    4. 带有约束的通配符参数段。
    5. 没有约束的通配符参数段。
  3. 在平局的情况下,路由按路由模板的不区分大小写的序号字符串比较 (OrdinalIgnoreCase) 排序。

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

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

1我真的不是编写正则表达式的专家,所以很遗憾,我无法就您需要的具体内容向您提供建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2017-07-07
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    相关资源
    最近更新 更多