C# 带斜杠的路线参数"/&引用;在URL中
我知道您可以在route属性中应用通配符以允许C# 带斜杠的路线参数"/&引用;在URL中,c#,url,asp.net-web-api,asp.net-web-api-routing,attributerouting,C#,Url,Asp.net Web Api,Asp.net Web Api Routing,Attributerouting,我知道您可以在route属性中应用通配符以允许/,例如日期输入: [Route("orders/{*orderdate}")] 通配符的问题只适用于URI中的最后一个参数。如果希望具有以下URI,如何解决该问题: [Route("orders/{orderdate}/customers")] 更新: 我知道通过重构代码来解决问题的选项很少,因此请不要提供类似以下内容的解决方案: 将路线模板更改为[路线(“订单/客户/{orderdate}”)] 将日期更改为其他格式(例如,“dd-mm-yy
/
,例如日期输入:
[Route("orders/{*orderdate}")]
通配符的问题只适用于URI中的最后一个参数。如果希望具有以下URI,如何解决该问题:
[Route("orders/{orderdate}/customers")]
更新:
我知道通过重构代码来解决问题的选项很少,因此请不要提供类似以下内容的解决方案:
[路线(“订单/客户/{orderdate}”)]
“dd-mm-yyyy”
)正如@AlexeiLevenkov的评论所指出的,这是错误的: URL中不能有接受前斜杠的参数,因为这是分隔每个URL片段的特殊符号。因此,无论何时在URL中包含此符号,都会有新的片段,单个参数不能包含多个片段 如果您想了解更多详细信息,但以下是最相关的摘录:
- URL路径在URL中找到的第一个
或?
中结束。因此,斜杠只会在URL路径中出现之前的部分或其中一个符号中创建片段 - 第3.4节:查询组件由第一个问号(“?”)字符表示,并以数字符号(“#”)字符或URI结尾
/
,并且它们根本不会定义路径段
以下是问题的一些解决方案:
- 包括日、月和年的片段,如下所示:
然后在服务器端创建日期[Route(“orders/{month}/{day}/{year}/customers”)]
- 要求用户使用不同的分隔符,如破折号或圆点,这样不会产生问题,在字符串处接收并自己解析(或使用自己的自定义活页夹支持该格式)
- 在URL到达路由系统之前,使用更改URL,并按照上一个解决方案中的说明对其进行解析(这需要在IIS中托管)
- 将其作为查询字符串接收,例如:')?日期=02/03/2015')(您最好对其进行编码)
like&id=27
。我更正了您的问题,因此它没有提到“查询字符串”,这不是您需要的正确名称。。我认为genericUriParserOptions
不再适用于.net 4.5或更高版本
正如@JotaBe所建议的,您可能需要正确解码url请求。在大多数情况下,%2F
将自动转换为斜杠'/'
。因此,如果需要转义,首先需要解码'%'
字符。。因此,您的URL:看起来像:www.domain.com/api/orders/23%252F06%252F2015/customers
请注意,字符'%252F'
将被转换为实际的'%2F'
编辑
好的,这是完整的解决方案(尝试过并为我工作):
[Route("orders/{date}/customers")]
public HttpResponseMessage Get(string date)
{
}
requestPathInvalidCharacters
设置为空,以告知asp.net允许所有请求
<system.web>
<httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/>
</system.web>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
您可以使用以下URI
[Route(“orders/{DD:int}/{MM:int}/{YY:int}}}/customers”)]
然后使用自定义模型活页夹将DD/MM/YY
转换为可以在动作方法中绑定的日期
您可以选择如何处理约束(对正则表达式更加严格),或者使用验证,如果不匹配,则返回400
更简单的方法是,将日/月/年
放在代码中
这里是一个链接 C#有自己的方法,可以跳过逃逸序列的规则
方法的名称为
Uri.UnescapeDataString(您的querystring参数)
您可以在获取参数值时使用它尝试使用“%2F”但没有运气。。。给我的请求错误无效这与正确编码无关!'%当API收到请求时,“2F”将自动被视为“/”。API还尝试在机器和web配置中设置以下设置,但没有成功<代码>可以在路径(按百分比编码%2f)和查询参数(按原样或编码)中设置
/
。因此,大多数答案都是完全错误的,但建议的解决方案可以作为变通办法(-1代表上半场,+1代表下半场=0)@AlexeiLevenkov说得不错。我已经更正了我的答案,以反映出那个大错误。我不知道这是如何回答用户的问题的。@Daniel。。如果你知道更好的方法,那么把它贴在这里!!我在过去处理过同样的问题,并使用“%252F”@ronnie解决了它-似乎是在为我做完美的工作!!“requestPathInvalidCharacters=”“”在我的web中丢失。不必进行双重转义。我对此表示感谢。我不知道您可以在路由中使用通配符,也就是{*orderdate}
中的*
。这实际上解决了我的问题,因为我的参数位于URL的末尾。
[Route("orders/{date}/customers")]
public HttpResponseMessage Get(string date)
{
DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015
}