我正在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)。也就是说,它更像是动态评估的查询选择而不是硬连线文件路径。它在服务器上进行评估。
别搞错了,我不是在这里建立一个典型的网站甚至是网络服务。
答案 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
(注意冒号继续哈希标记)
来源
:
添加到ASP.NET中的网址并使用A potentially dangerous Request.Path value was detected from the client (:)