bet*_*bet 35 c# url asp.net-web-api attributerouting asp.net-web-api-routing
我知道您可以在route属性中应用通配符以允许/例如日期输入:
[Route("orders/{*orderdate}")]
Run Code Online (Sandbox Code Playgroud)
通配符的问题仅适用于URI中的最后一个参数.如果要拥有以下URI,如何解决问题:
[Route("orders/{orderdate}/customers")]
Run Code Online (Sandbox Code Playgroud)
更新:
我知道通过重构代码来解决问题的选择很少,所以请不要提供类似的解决方案:
[Route("orders/customers/{orderdate}")]"dd-mm-yyyy")小智 27
@bet ..我认为genericUriParserOptions不再适用于.net 4.5或更高版本..
同样如@JotaBe所建议的,您可能需要正确解码url请求.在大多数情况下,%2F将自动转换为斜杠'/',所以如果你需要转义它,你需要首先解码'%'字符..所以你的URL:看起来像:www. domain.com/api/orders/23%252F06%252F2015/customers
请注意,字符'%252F'将转换为实际'%2F'
编辑
好的,这是完整的解决方案(试过它并为我工作):
假设你有一个像这样的API端点:
[Route("orders/{date}/customers")]
public HttpResponseMessage Get(string date)
{
}
Run Code Online (Sandbox Code Playgroud)在web.config中,您需要将requestPathInvalidCharacters设置为empty,告诉asp.net允许所有请求
<system.web>
<httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/>
</system.web>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)当客户端向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
}
Run Code Online (Sandbox Code Playgroud)如@AlexeiLevenkov的评论所述,这是错误的:
您不能在URL中有一个接受正斜杠的参数,因为这是一个分隔每个URL片段的特殊符号.因此,只要在URL中包含此符号,就会有新的片段,并且单个参数不能包含多个片段.
如果您想了解更多详情,请阅读本文,但这些是最相关的摘录:
?或#在URL中找到.因此,斜杠仅在出现之前的URL路径部分或其中一个符号中创建片段.因此,/如果需要,查询字符串可以包含正斜杠,并且它们根本不会定义路径段.
这些是问题的一些解决方案:
[Route("orders/{month}/{day}/{year}/customers")]然后在服务器端创建日期注意:您的原始问题是"查询字符串",我对编码的评论是指查询字符串,这是问号后面的URL的最后一段(如果存在)like &id=27.我更正了你的问题,所以它没有提到"查询字符串",这不是你需要的正确名称
| 归档时间: |
|
| 查看次数: |
31415 次 |
| 最近记录: |