[英]Route parameter with slash “/” in URL
我知道你可以在路由属性中应用通配符来允许/
例如日期输入,例如:
[Route("orders/{*orderdate}")]
通配符的问题仅适用于URI中的最后一个参数。 如果要拥有以下URI,如何解决问题:
[Route("orders/{orderdate}/customers")]
更新:
我知道通过重构代码来解决问题的选择很少,所以请不要提供类似的解决方案:
[Route("orders/customers/{orderdate}")]
"dd-mm-yyyy"
) @bet ..我认为genericUriParserOptions
不再适用于.net 4.5或更高版本..
另外,正如@JotaBe所建议的那样 ,您可能需要正确解码网址请求。 在大多数情况下, %2F
将自动转换为斜杠'/'
。 因此,如果你需要逃避它,你需要首先解码'%'
字符..所以你的URL:看起来像: www.domain.com/api/orders/23%252F06%252F2015/customers
请注意,字符'%252F'
将转换为实际'%2F'
编辑
好的,这是完整的解决方案(试过它并为我工作):
假设你有一个像这样的API端点:
[Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { }
在web.config中,您需要将requestPathInvalidCharacters
设置为empty,告诉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路径部分或其中一个符号中创建片段。 因此,查询字符串可以包含正斜杠, /
,如果需要的话,他们不会在所有定义路径段。
这些是问题的一些解决方案:
[Route("orders/{month}/{day}/{year}/customers")]
然后在服务器端创建日期 注意:您的原始问题是“查询字符串”,而我对编码的评论是指查询字符串,它是问号后面的URL的最后一段(如果存在), like &id=27
。 我更正了你的问题,所以它没有提到“查询字符串”,这不是你需要的正确名称
您可以使用以下URI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")]
然后使用自定义模型绑定器来获取DD/MM/YY
和将它们转换为您可以在动作方法中绑定的日期。
您可以选择如何处理约束(更严格地使用正则表达式)或使用验证并返回400(如果不匹配)。
更简单的方法是采用Day/Month/Year
并将其放在代码中。
这是一个处理模型绑定的链接。
C#有自己的方法,它跳过转义序列的规则,方法的名称是Uri.UnescapeDataString( 你的查询字符串参数 )你可以在获取参数值时使用它
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.