获取带有url编码斜线的url

我想发送一个HTTP GET到http://example.com/%2F 。 我的第一个猜测会是这样的:

 using (WebClient webClient = new WebClient()) { webClient.DownloadData("http://example.com/%2F"); } 

不幸的是,我可以看到实际上发送的是什么:

 GET // HTTP/1.1 Host: example.com Connection: Keep-Alive 

所以http://example.com/%2F在传送之前会被翻译成http://example.com// 。

有没有办法实际发送这个GET请求?

OCSP协议要求在通过HTTP / GET使用OCSP时发送base-64编码的url编码,所以有必要发送一个实际的%2F而不是'/'来符合。

编辑:

以下是OCSP协议标准( RFC 2560附录A.1.1)的相关部分:

使用GET方法的OCSP请求构造如下:

GET {url} / {OCSPRequest的DER编码的base-64编码的url编码}

我对这个问题的其他解读非常开放,但我看不出还有什么意思。

默认情况下, Uri类不会允许URI中的转义/字符( %2f )(即使这看起来在我阅读RFC 3986中是合法的)。

 Uri uri = new Uri("http://example.com/%2F"); Console.WriteLine(uri.AbsoluteUri); // prints: http://example.com// 

(注意: 不要使用Uri.ToString打印URI。)

根据Microsoft Connect上有关此问题的错误报告 ,此行为是有意devise的,但您可以通过将以下内容添加到您的app.config或web.config文件来解决此问题:

 <uri> <schemeSettings> <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" /> </schemeSettings> </uri> 

(从https://stackoverflow.com/a/10415482转发,因为这是“官方”的方式来避免这个错误,而不使用reflection来修改私人领域。;

编辑:连接错误报告不再可见,但<schemeSettings>的文档build议这种方法允许URI中的转义/字符。 请注意(根据该文章),可能会对不能正确处理转义斜线的组件产生安全隐患。

这是一个可怕的黑客攻击,必将与未来的框架版本不兼容等等。

但它的作品!

(在我的机器上…)

 Uri uri = new Uri("http://example.com/%2F"); ForceCanonicalPathAndQuery(uri); using (WebClient webClient = new WebClient()) { webClient.DownloadData(uri); } void ForceCanonicalPathAndQuery(Uri uri){ string paq = uri.PathAndQuery; // need to access PathAndQuery FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic); ulong flags = (ulong) flagsFieldInfo.GetValue(uri); flags &= ~((ulong) 0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical flagsFieldInfo.SetValue(uri, flags); } 

更新:看起来Uri类的默认行为实际上是在.NET 4.5中改变的 ,现在你可以使用转义斜杠,它们不会被触及。

我在.NET 3.5,.NET 4.0,.NET 4.5 / 4.5.1中运行以下代码

 static void Main(string[] args) { var uri = new Uri("http://www.yahooo.com/%2F"); var client = new WebClient(); client.DownloadString(uri); } 

在.NET 3.5 / 4.0中,跟踪显示%2F事实上未按预期转换。

提琴手痕迹

但是,在.NET 4.5 / 4.5.1中,你可以看到%2F没有被转义(注意GET /%2F)

提琴手痕迹

你甚至可以在Uri上使用ToString(),你会得到相同的结果。

所以总而言之,看起来如果你使用.NET> = .NET 4.5,那么事情就会像应该与RFC一样行事。

我只是做了一个探索尝试在单声道上工作的方法。 我在这里发布了我的问题: 在单声道上获得带有斜线的Uri

对其进行双重编码: %252F

但是,如果你使用HttpWebRequest,你实际上可以告诉不要编码的URL,无论任何方式它应该工作。

另外,如果WebClient接受URI,那么你可以创build一个新的URI,你可以将其设置为不编码。