在ASP.NET / IIS的URL中使用冒号(:)

时间:2009-03-20 18:42:54

标签: asp.net iis url httphandler colon

我正在ASP.NET MVC中实现自定义控制器,而真的希望能够在网址中使用冒号,以便我可以识别类/列名称及其值,例如这样:

http://example.com/user:chaiguy

...但显然ASP.NET或IIS不允许在网址中使用冒号。我做了一些挖掘,显然它被认为是一个安全问题,但是,我正在使用MVC并且正在手动处理所有 url路径(只是将它们视为字符串),而不是将它们与文件系统相关联,所以我很确定这不适用。

我也听过一些关于实现自定义Http处理程序的讨论。

任何想法或想法都会非常感激。


  呃......为什么?说真的,为什么打破标准? - 兰道夫

...

  

然后,我建议您调查构建Web服务。 WCF是一个很好的技术,它在IIS中运行良好。

我碰巧喜欢网址,而WCF对我来说太复杂了。我希望它与url兼容,如REST,但不仅能够导航层次结构,还能做好布局的事情。我用/ users / chaiguy的问题是它解释了没有的层次结构:在我的系统中“user”是一个类,它不是一个文件夹。 user:chaiguy表示具有值为“chaiguy”的用户类的实例,并且该单个实体具有子实体的潜力。例如:

/user:chaiguy/name

...我想显示该实体的名称。如果我用你的方法做到这一点,它将如下所示:

/users/chaiguy/name

问题是你怎么知道班级是什么,有什么价值?它可以解释为

/users/chaiguy:name

在我的系统中,这没有意义。看看我的目标是什么?为了给出稍微复杂的示例,假设我们想要从多个实例中选择用户实体的子代。因此用户可能有多个电子邮件地址。要选择一个,我们可以使用:

/user:chaiguy/email:me@here.com/

所以它实际上是递归的。它不是一个文件路径,它更像是一个XPath(或者类似于基于我所知甚少的jQuery)。也就是说,它更像是动态评估的查询选择而不是硬连线文件路径。它在服务器上进行评估。

别搞错了,我不是在这里建立一个典型的网站甚至是网络服务。

8 个答案:

答案 0 :(得分:16)

更改web.config中的requestPathInvalidCharacters的{​​{1}}属性:

httpRuntime

并且ASP.NET不应再阻止请求路径中的冒号。

答案 1 :(得分:4)

在这里回答了类似的问题:https://stackoverflow.com/a/12037000/134761

似乎ASP.net在'?'之前不允许冒号在URL中,即使它被编码为%3A。

例如,这些不起作用:

http://foo.org/api/persons/foo:bar

http://foo.org/api/persons/foo%3abar

但这有效:

http://foo.org/api/persons?id=foo%3abar

在所有示例中,我们希望ASP.NET MVC将“foo:bar”作为id参数传递,并正确解码。我刚刚用MVC4对它进行了测试,它似乎有效。令人讨厌的是它不接受问号之前的URL编码,但我确信它有充分的理由。可能要在问号前面保留一切有效的URL和问号后面的任何参数。

答案 2 :(得分:1)

我建议你重新考虑一下你想做什么。使用路径指示上下文并隐藏您的类和字段名称,将URL路径中的特定上下文映射到类名和字段。例如,如果您需要指明用户,请构建类似example.com/users/chaiguy而非example.com/user:chaiguy的网址布局。

答案 3 :(得分:1)

尝试设置HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ HTTP \ Parameters \ AllowRestrictedChars。这是http://support.microsoft.com/?id=820129。我不知道ASP.NET / MVC是否自己做了一些检查,但是如果它只是阻止你的http.sys,那应该解决它。

答案 4 :(得分:0)

实际上有WCF REST可用,您可以使用可用的WCF入门套件here在一小时内轻松启动并运行。这需要REST的强大功能,并将其与WCF的易用性相结合。此外,使用WCF,您还可以创建自己的传输层,如果需要,可以以任何方式解析URL。关于入门套件的一个有趣的事情是,它允许Url中的空间,这实际上引起了真正的REST基金的一些麻烦。

由于WCF,我并不热衷于查看它,但你真的不需要知道那么多。该解决方案可以创建您需要的所有内容,只需添加代码即可。

答案 5 :(得分:0)

这个web.config设置对我有用。它接受网址中的冒号(:)。

<httpRuntime targetFramework="4.6.1" requestPathInvalidCharacters=""/>

答案 6 :(得分:-4)

我建议使用一段时间。基于HTTP协议的REST是为HTTP建立新用途的一个例子,它保持标准并且非常成功。也许你可以做到。

AND a'。'在许多语言中都是标准的“class.method”或“class.attribute”。

现在我,我想在时间URL参数中使用冒号,有些地方正在这样做。我仍然要看看我是否可以逃脱它。

PS,对我来说,我可以用这个:      http://www.businesscasualblog.com/2009/07/how-to-share-a-link-to-a-specific-timecode-in-youtube-video.html

esentially'--h - m - s'

答案 7 :(得分:-10)

网址中的冒号有效吗?简答

答案很长,是的,如果它在网址片段中。

示例:http://site/gwturl#user:45/comments(注意冒号继续哈希标记)

来源

  • 这个答案,
  • Is a colon safe for friendly-URL use?
  • 以及仅将:添加到ASP.NET中的网址并使用A potentially dangerous Request.Path value was detected from the client (:)
  • 获取YSOD的个人测试