URL 中带有斜杠“/”的路由参数

本文关键字:路由 参数 URL | 更新日期: 2023-09-27 17:57:23

我知道您可以在 route 属性中应用通配符以允许/例如日期输入:

[Route("orders/{*orderdate}")]

通配符的问题仅适用于 URI 中的最后一个参数。如果要具有以下 URI,如何解决问题:

[Route("orders/{orderdate}/customers")]

更新:

我知道通过重构代码来解决问题的选项很少,所以请不要提供这样的解决方案:

  1. 将路由模板更改为[Route("orders/customers/{orderdate}")]
  2. 将日期更改为其他格式(例如 "dd-mm-yyyy"

URL 中带有斜杠“/”的路由参数

@bet.. 我认为genericUriParserOptions不再适用于.net 4.5或更高版本。

此外,按照 @JotaBe 的建议,您可能需要正确解码 url 请求。 在大多数情况下,%2F将自动转换为斜杠'/'。因此,如果您需要转义它,则需要首先解码'%'字符。 所以你的网址:将看起来像:www.domain.com/api/orders/23%252F06%252F2015/customers

请注意,'%252F'字符将转换为实际'%2F'

编辑

好的,这是完整的解决方案(尝试并为我工作):

  1. 假设您有一个如下所示的 API 端点:

    [Route("orders/{date}/customers")]
    public HttpResponseMessage Get(string date)
    {
    }
    
  2. web.config 中,您需要将requestPathInvalidCharacters设置为空,告诉 asp.net 允许所有请求

    <system.web>
        <httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/>                
    </system.web>
    <system.webServer>
        <security>
          <requestFiltering allowDoubleEscaping="true" />
        </security>
    </system.webServer>
    
  3. 当客户端将请求发送到 API 时,您需要确保像这样转义'%'

    www.domain.com/api/orders/23%252F06%252F2015/customers

  4. 然后,您需要解码请求

    [Route("orders/{date}/customers")]
    public HttpResponseMessage Get(string date)
    {
            DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015
    }
    

正如@AlexeiLevenkov的评论中所指出的,这是错误的:

URL 中不能有接受正斜杠的参数,因为这是一个特殊的符号,用于分隔每个 URL 片段。因此,每当您在 URL 中包含此符号时,都会有新的片段,并且单个参数不能包含多个片段。

如果您想了解更多细节,请阅读以下内容,但这些是最相关的摘录:

    URL
  • 路径在 URL 中找到的第一个?或第一个#中完成。因此,斜杠仅在出现之前的 URL 路径部分或这些符号之一中创建片段。
  • 从第 3.4 节开始:查询组件由第一个问号 ("?") 字符指示,并以数字符号 ("#") 字符或 URI 末尾终止。

因此,如果需要,查询字符串可以包含正斜杠、/,并且它们根本不会定义路径段。

这些是该问题的一些解决方案:

  • 包括日、月和年的片段,如下所示: [Route("orders/{month}/{day}/{year}/customers")],然后在服务器端创建日期
  • 要求用户使用不会产生问题的其他分隔符,如破折号或点,以字符串接收它并自己解析它(或使用您自己的自定义活页夹来支持该格式)
  • 使用 URL 重写扩展在 URL 到达路由系统之前对其进行更改,并按照前面的解决方案中的说明对其进行分析(这需要在 IIS 中承载)
  • 将其作为查询字符串接收,即如下所示:"?date=02/03/2015"(您最好对其进行编码)

注意:您最初的问题是"查询字符串",而我关于编码的评论指的是查询字符串,这是问号(如果存在)之后的 URL 的最后一段,like &id=27 .我更正了您的问题,使其没有提及"查询字符串",这不是您需要的正确名称

C# 有自己的方法,谁跳过转义序列的规则方法的名称是Uri.UnescapeDataString(您的查询字符串参数您可以在获取参数值时使用它

您可以使用

以下 URI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")],然后使用自定义模型绑定程序获取DD/MM/YY并将其转换为可在操作方法中绑定的日期。

您可以选择如何处理约束(使用正则表达式更严格),或者使用验证并在不匹配时返回 400。

更简单的方法是,获取Day/Month/Year并将其放在代码中。

这是处理模型绑定的链接。