C# 带斜杠的路线参数"/&引用;在URL中

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属性中应用通配符以允许
/
,例如日期输入:

[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')(您最好对其进行编码)
    注意:您最初的问题是“查询字符串”,我关于编码的评论是指查询字符串,它是URL中问号后面的最后一段,如果有,
    like&id=27
    。我更正了您的问题,因此它没有提到“查询字符串”,这不是您需要的正确名称。。我认为
    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)
    {
    }
    
  • 在web.config中,您需要将
    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
    }