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

jaxagkaj  于 2023-01-21  发布在  .NET
关注(0)|答案(8)|浏览(181)

我在ASP.NET MVC中实现了一个自定义控制器,并且 * 真的 * 希望能够在URL中使用冒号,这样我就可以标识类名/列名及其值,如下所示:
http://example.com/user:chaiguy
...但显然ASP.NET或IIS不允许在url中使用冒号。我做了一些调查,显然这被认为是一个安全问题,* 但是 *,我使用MVC并且手动处理 * 所有 * url路径(只是将它们作为字符串处理),并且不将它们与文件系统关联,所以我非常确定这不适用。
我还听到一些关于实现自定义Http处理程序之类的讨论。
任何想法或主意都将不胜感激。
呃......为什么?说真的,为什么要违反标准?--兰道夫
...
那么我建议你研究一下构建一个Web服务。WCF是一个很好的技术,它在IIS中宿主得很好。
我碰巧喜欢url,而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,基于我对它所知甚少)。也就是说,它更像是一个动态求值的查询选择,而不是一个硬连接的文件路径。它在服务器上求值。
请不要搞错,我并不是在这里构建一个典型的Web站点甚至Web服务。

tvmytwxo

tvmytwxo1#

更改web.config中httpRuntimerequestPathInvalidCharacters属性:

<httpRuntime maxRequestLength="20480" requestValidationMode="2.0" requestPathInvalidCharacters="" maxQueryStringLength="20480" />

并且ASP.NET应该不再阻止冒号进入请求路径。

67up9zun

67up9zun2#

在此回答了类似问题:https://stackoverflow.com/a/12037000/134761
www.example.com似乎不允许在URL中的"?"前使用冒号,即使该URL编码为%3A。ASP.net does not allow colons before the '?' in an URL, even if it is encoded as %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,问号后面的所有参数都是有效的。

sg24os4d

sg24os4d3#

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

uemypmqf

uemypmqf4#

这个web.config设置对我很有效,它接受url中的冒号(:)。

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

bwitn5fc5#

我建议你重新考虑一下你想要做什么。使用路径来指示上下文,隐藏你的类名和字段名,将你的URL路径中的特定上下文Map到类名和字段。例如,如果你需要指示一个用户,那么构建你的URL布局就像example.com/users/chaiguy而不是example.com/user:chaiguy

de90aj5v

de90aj5v6#

实际上有WCF REST可用,你可以很容易地启动和运行在一个小时内通过使用WCF初学者工具包here。这需要的力量,REST和WCF的易用性相结合。同样与WCF,你也可以创建自己的传输层,如果你需要,可以解释URL的任何方式。初学者工具包的一个有趣之处是它允许在URL中使用空格,这实际上给真正的REST fundi带来了一些麻烦。
由于WCF的原因,我并不热衷于看它,但是你真的不需要知道那么多。这个解决方案创建了你需要的一切,只需添加代码。

yzckvree

yzckvree7#

我建议使用句号。REST,基于HTTP协议,是一个建立HTTP新用途的例子,它保持了标准,并且非常成功。也许你可以这样做。
在许多语言中,'.'是标准的'类.方法'或'类.属性'.
现在我,我想在时间URL参数中使用冒号,有些地方正在这样做。我仍然要看看我是否能摆脱它。
PS,对我来说,我可能会用这个:http://www.businesscasualblog.com/2009/07/how-to-share-a-link-to-a-specific-timecode-in-youtube-video.html
本质上是“--h--m--s”

gev0vcfq

gev0vcfq8#

冒号在URL中是否有效?简短答案

长答案,是的,如果它在一个url片段中。
示例:http://site/gwturl#user:45/comments(注意冒号位于散列标记之前)
来源

  • 这个答案,
  • Is a colon safe for friendly-URL use?
  • 沿着一个个人测试,就是在ASP.NET中将:添加到url中,然后使用A potentially dangerous Request.Path value was detected from the client (:)获取YSOD

相关问题