我正在使用Visual Studio 2010和Asp开发服务器。
但是,我无法让ASP dev服务器处理该请求,因为路径中包含“http:”。 我尝试创建HTTPModule在BeginRequest中重写URL,但当URL为http://localhost:5957/http://yahoo.com时,事件处理程序不会被调用。如果URL为http://localhost:5957/http/yahoo.com,则事件处理程序会被调用。
总结一下: 有什么想法吗?
来自ASP.Net团队的Stefan:http://forums.asp.net/p/1431148/3221542.aspx
在当前版本的ASP.NET中,包含冒号等字符的URL将被拒绝作为潜在的安全威胁。历史原因是底层NTFS文件系统支持可通过名称访问的备用资源流,例如“yourfile.txt:hiddendata.txt”。从Url中阻止冒号字符可以防止编写不良应用程序意外使用备用资源流。
在当前版本的ASP.NET中还存在一个限制,即传入的Url需要映射到NTFS文件系统,以确定托管配置数据。
在ASP.NET 4中,可以选择性地删除这些限制。然而,这些更改仅在ASP.NET 4的Beta 2 版中提供 - 在Beta 1中不存在。我们尝试了本论坛帖子中列出的Url,并确认使用我们内部构建的ASP.NET 4可以使用该样式的Url并在没有任何400错误的情况下处理它。
- Stefan
来自 ASP.Net 团队的 Stefan:
以下内容摘自即将发布的 Beta 2 的 "新功能" 文档:
ASP.NET 4 引入了扩展允许应用程序 Url 范围的新选项。最简单和最有用的更改是,ASP.NET 给开发人员提供了允许更长的 Url 的选项。以前的版本将 Url 路径长度限制为260个字符(NTFS 文件路径限制)。在 ASP.NET 4 中,开发人员可以使用两个新的 httpRuntime 配置属性增加(或减少)Url 的限制,以适应其应用程序:
修改 "maxRequestPathLength" 的值以允许更长或更短的 Url 路径(Url 除协议、服务器和查询字符串部分之外的部分)。修改 "maxQueryStringLength" 的值以允许更长或更短的查询字符串。
ASP.NET 4 还认可开发人员调整 ASP.NET Url 字符检查所使用的字符集。当 ASP.NET 在 Url 的路径部分中发现无效字符时,它会拒绝请求并返回 HTTP 400 错误。在之前的版本中,Url 字符检查仅限于一组固定的字符。在 ASP.NET 4 中,开发人员可以使用另一个新的 httpRuntime 配置属性自定义字符检查集合:
默认情况下,“requestPathInvalidChars”属性包含七个被认为是无效的字符(小于号和大于号以及&符号已编码,因为配置是 Xml 文件)。然后,开发人员可以根据其应用程序的需求扩展或减少无效字符集合。请注意,ASP.NET 4 仍将拒绝包含 ASCII 字符范围为0x00-0x1F的任何 Url 路径,因为这些字符被认为是无效的 Url 字符(RFC 2396 认为这些字符是无效的,在运行 IIS6 或更高版本的 Windows 服务器上,http.sys 协议设备驱动程序也会自动拒绝带有这些字符的 Url)。
将 Web 项目属性更改为“使用 IIS 本地服务器”,并选中“使用 IIS Express”(这将保留 VS Dev Server 的 URL)。
在 <system.web>
中的 Web.config 中添加以下设置:
<httpRuntime requestPathInvalidCharacters="" />
对于生产部署,请考虑其他答案中提到的安全注意事项。
KB文章826437(http://support.microsoft.com/kb/826437)包含了你的问题的答案。
这对我有用(IIS 6,ASP.NET 4),可能对你也有用。
我在这里回答了一个类似的问题。
基本上,ASP.net 只接受在问号之后编码的字符,比如冒号。幸运的是,ASP.net MVC在默认映射中自动将/api/persons/xxxx和/api/persons?id=xxxx两者都映射到相同的位置,所以我最终采取了这种方式。在重定向到字符串之前,您需要使用HttpUtility.UrlEncode对其进行编码。
我不确定digg正在使用哪个Web服务器,但我敢打赌这在IIS或VS内置的Web服务器中根本不可能实现。最有可能的是它是一个可以修改以允许各种古怪URL的Web服务器。