URL 中带有斜杠“/”的路由参数
本文关键字:路由 参数 URL | 更新日期: 2023-09-27 17:57:23
我知道您可以在 route 属性中应用通配符以允许/
例如日期输入:
[Route("orders/{*orderdate}")]
通配符的问题仅适用于 URI 中的最后一个参数。如果要具有以下 URI,如何解决问题:
[Route("orders/{orderdate}/customers")]
更新:
我知道通过重构代码来解决问题的选项很少,所以请不要提供这样的解决方案:
- 将路由模板更改为
[Route("orders/customers/{orderdate}")]
- 将日期更改为其他格式(例如
"dd-mm-yyyy"
)
@bet.. 我认为genericUriParserOptions
不再适用于.net 4.5或更高版本。
此外,按照 @JotaBe 的建议,您可能需要正确解码 url 请求。 在大多数情况下,%2F
将自动转换为斜杠'/'
。因此,如果您需要转义它,则需要首先解码'%'
字符。 所以你的网址:将看起来像:www.domain.com/api/orders/23%252F06%252F2015/customers
请注意,'%252F'
字符将转换为实际'%2F'
编辑
好的,这是完整的解决方案(尝试并为我工作):
-
假设您有一个如下所示的 API 端点:
[Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { }
-
在 web.config 中,您需要将
requestPathInvalidCharacters
设置为空,告诉 asp.net 允许所有请求<system.web> <httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/> </system.web> <system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer>
-
当客户端将请求发送到 API 时,您需要确保像这样转义
'%'
:www.domain.com/api/orders/23%252F06%252F2015/customers
-
然后,您需要解码请求
[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
并将其放在代码中。
这是处理模型绑定的链接。