4

我正在尝试创建类似于 diggbar 的东西。

我正在使用 Visual Studio 2010 和 Asp 开发服务器。

但是,我无法让 ASP 开发服务器处理该请求,因为它在路径中包含“http:”。我试图创建一个 HTTPModule 来重写 BeginRequest 中的 URL,但是当 URL 为http://localhost:5957/http://yahoo.com时,不会调用事件处理程序。如果 url 是http://localhost:5957/http/yahoo.com ,事件处理程序会被调用

总结一下:

有任何想法吗?

4

12 回答 12

13

我在 Stefan 的帮助下写了一篇文章,解释了如何做到这一点:

古怪的实验:在 ASP.NET/IIS 请求 URL 中允许百分比、尖括号和其他顽皮的东西

于 2010-06-09T21:56:31.193 回答
7

来自 ASP.Net 团队的 Stefan:http ://forums.asp.net/p/1431148/3221542.aspx

在当前版本的 ASP.NET Urls 中,包含冒号等字符的 URL 将被视为潜在的安全威胁而被拒绝。其历史原因是底层 NTFS 文件系统支持备用资源流,可以使用类似“yourfile.txt:hiddendata.txt”的名称访问这些资源流。阻止 Urls 中的冒号字符可防止编写不佳的应用程序意外使用备用资源流。

当前版本的 ASP.NET 中还有一个限制,即传入的 Url 需要映射到 NTFS 文件系统以确定托管配置数据。

在 ASP.NET 4 中,可以选择删除这些限制。但是,这些更改在 ASP.NET 4 的Beta 2版本中 - 它们不在 Beta 1 中。我们尝试了本论坛帖子前面列出的 Url,并确认通过我们的 ASP.NET 4 内部构建,您可以使用该样式Url 并处理它而不会出现任何 400 错误。

-斯特凡

于 2009-06-10T01:29:44.260 回答
5

来自 ASP.Net 团队的 Stefan

我从即将发布的涵盖 Beta 2 的 What's New 文档中截取了以下内容:

ASP.NET 4 引入了用于扩展允许的应用程序 URL 范围的新选项。最简单和最有用的更改是 ASP.NET 为开发人员提供了允许更长 URL 的选项。以前的版本将 Url 路径长度限制为 260 个字符(NTFS 文件路径限制)。在 ASP.NET 4 中,开发人员可以使用两个新的 httpRuntime 配置属性,根据他们的应用程序选择增加(或减少)这个限制:

修改“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)。

  • 斯特凡
于 2009-06-15T19:45:34.730 回答
3

我在为 ASP.net创建URL 缩短器时遇到了这个问题。在我的一生中,我无法以 ASP 接受的方式对冒号进行编码,在客户端使用 HttpUtility.UrlEncode 或 javascript 的 escape()。

我的解决方案如何进行 Base64 编码。将整个事情变成无争议的字母数字。然后你在服务器上解码。我使用了这些功能

此外,我创建了一个由前导连字符触发的 HttpModule,因此我知道将后面的内容作为要解码的 URL 来处理。如果您想了解更多详细信息,请联系我。

于 2009-06-10T03:29:36.313 回答
0

我在这里回答了一个类似的问题。

https://stackoverflow.com/a/12037000/134761

基本上,ASP.net 只接受问号后的冒号等编码字符。幸运的是,ASP.net MVC 在默认映射中自动映射 /api/persons/xxxx 和 /api/persons?id=xxxx,所以这就是我最终要做的。

于 2012-08-20T11:47:10.953 回答
0

我不确定 digg 正在使用什么 Web 服务器,但我敢打赌这对于 IIS 或 VS 的内置 Web 服务器是不可能的。很可能它是一个可以修改以允许各种古怪 URL 的 Web 服务器。

于 2009-06-04T03:43:07.480 回答
0

试试HttpUtility.UrlPathEncode(url)- MSDN 文档

于 2010-11-03T14:52:48.853 回答
0

这不是 IIS 失败,而是 ASP 开发服务器。尝试部署到 IIS 并查看它是否有效。

于 2009-06-04T15:03:23.393 回答
0

我很确定你可以通过 IIS 重写来做到这一点。据我所知,ASP.NET 开发服务器无法进行重写,但您可以尝试使用 IIS7 重写器,或者如果您有早期版本,请使用Ionics ISAPI Rewrite Filter

于 2009-06-04T15:07:12.077 回答
0

在重定向到它之前,您需要在字符串上使用 HttpUtility.UrlEncode。

于 2009-06-04T03:30:04.413 回答
0

知识库文章 826437 ( http://support.microsoft.com/kb/826437 ) 包含您的问题的答案

  1. 确保计算机上安装了 Microsoft .NET 1.1 SP1
  2. 在注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET 中创建 VerificationCompatibility = 1 的 32 位 DWORD 值
  3. 重新启动 IIS。

它对我有用(IIS 6、ASP.NET 4),也许它也对你有用

于 2010-04-30T11:56:29.067 回答
0

开发环境的快速解决方案:

  • 将 Web 项目属性更改为“使用 IIS 本地服务器”并选中“使用 IIS Express”(保留 VS 开发服务器的 URL)。

  • 在 Web.config 里面添加以下设置<system.web>

    <httpRuntime requestPathInvalidCharacters="" />
    

对于生产部署,请考虑其他答案中提到的安全注意事项。

于 2011-09-16T22:30:29.407 回答