首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >URL中带有斜杠"/“的路由参数

URL中带有斜杠"/“的路由参数
EN

Stack Overflow用户
提问于 2015-06-22 13:23:28
回答 4查看 50.5K关注 0票数 48

我知道您可以在路由属性中应用通配符来允许日期输入,例如:/

代码语言:javascript
运行
复制
[Route("orders/{*orderdate}")]

通配符的问题只适用于URI中的最后一个参数。如果我想拥有以下URI,该如何解决这个问题:

代码语言:javascript
运行
复制
[Route("orders/{orderdate}/customers")]

更新:

我知道通过重构代码来解决这个问题的选择很少,所以请不要提供这样的解决方案:

更改路径模板以将日期转换为不同的格式(例如"dd-mm-yyyy"),

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-23 12:54:28

@下注..我认为genericUriParserOptions不再适用于.net 4.5或更高版本。

同样,正如@JotaBe所建议的,您可能需要正确解码url请求。在大多数情况下,%2F将自动转换为斜杠'/'。因此,如果需要对其进行转义,首先需要对'%'字符进行解码。因此,您的URL:将类似于:www.domain.com/api/orders/23%252F06%252F2015/customers

请注意,字符'%252F'将被转换为实际的'%2F'

编辑

好的,这是完整的解决方案(我试过了,对我来说很有效):

假设您有一个端点,如下所示:

HttpResponseMessage (“orders/{date}/customers”) public date Get(string date) {}

  • 在web.config中,您需要将requestPathInvalidCharacters设置为空,这将告诉asp.net允许所有请求

API API

  • When向发送请求的客户端需要确保转义,如下所示:

然后www.domain.com/api/orders/23%252F06%252F2015/customers

  • You需要对请求进行解码

DateTime.Parse(System.Net.WebUtility.UrlDecode(date));(“orders/{ date }/customers”) public date Get(string HttpResponseMessage ){ DateTime actualDate =Route // date is 23/06/2015 }

票数 34
EN

Stack Overflow用户

发布于 2015-06-22 15:58:20

正如@AlexeiLevenkov在评论中指出的那样,这是错误的:

URL中不能有接受正斜杠的参数,因为这是分隔每个

片段的特殊符号。因此,每当您在URL中包含此符号时,都会有新的片段,并且一个参数不能包含多个片段。

如果你想了解更多细节,请访问read this,但以下是最相关的摘录:

  • 在URL中找到的第一个?#中结束URL路径。因此,斜杠只在URL path的出现或其中一个符号之前的部分创建片段。
  • 来自3.4节:查询组件由第一个问号("?")表示。字符,并以数字符号("#")字符或URI结尾结束。

因此,如果需要,查询字符串可以包含正斜杠、/,并且它们根本不会定义路径段。

以下是这个问题的一些解决方案:

  • 包括日、月和年的片段,如下所示:[Route("orders/{month}/{day}/{year}/customers")],然后在服务器端创建日期
  • 要求用户使用不同的分隔符,如破折号或点,这不会产生问题,在字符串中接收它并自己解析(或者使用您自己的自定义绑定器来支持该格式)
  • 在它到达路由系统之前使用URL Rewrite extension更改URL,并按照前面的解决方案(这需要托管在IIS中)

<代码>H121将其作为查询字符串接收。例如:‘?date=02/03/2015’(你最好对它进行编码)

注意:您的原始问题是“查询字符串”,而我关于编码的评论是指查询字符串,它是问号后面的最后一段网址,如果有的话,就是like &id=27__。我更正了你的问题,所以它没有提到“查询字符串”,这不是你需要的名称

票数 9
EN

Stack Overflow用户

发布于 2015-06-23 13:20:43

您可以使用以下URI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")],然后使用自定义模型绑定器获取DD/MM/YY,并将其转换为可在操作方法中绑定的日期。

您可以选择如何处理约束(更严格地使用正则表达式),或者使用验证并在不匹配时返回400。

更简单的方法是,将Day/Month/Year放入代码中。

这里有一个dealing with modelbinding的链接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30972578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档