帮助解决C# HttpWebRequest URI丢失编码的问题

11

我的HttpWebRequest在解码已编码的URL时出现了问题。

var requestUrl = "https://www.google.com/webmasters/tools/feeds/http%3A%2F%2Fwww%2example%2Ecom%2F/crawlissues/";   
var request = (HttpWebRequest)WebRequest.Create(requestUrl);

当查看最终请求的URL时,它变成了:

https://www.google.com/webmasters/tools/feeds/http://www.example.com//crawlissues/

这当然会返回400错误请求。我猜测问题出在URI类而不是HttpWebRequest上。我该如何防止这种情况发生?


你期望的输出URL是什么?谢谢。 - Mahesh Velaga
URL 的意思是 https://www.google.com/webmasters/tools/feeds/http%3A%2F%2Fwww%2example%2Ecom%2F/crawlissues/ ,你可以看到域名被编码了,而且需要保持编码状态。 - user275939
5个回答

5
这是 Uri 类的一个令人烦恼的“安全特性”。如果您使用的是4.0或更高版本,您可以在配置文件中关闭它;否则,您将不得不采用反射方法

谢谢,Richard!我已经到处寻找这个——以下内容在 .net 4.5 中非常有效: <uri> <schemeSettings> <add name = "http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" /> </schemeSettings> </uri> - Dr. Hilarius
配置文件也可以在4.6上禁用它。 - r590
@r590:没错。我应该说“4.0或更高版本”,但当我发布这篇文章时,它意味着“4.0或4.5”。 :) - Richard Deeming

1

我认为您无法请求该URL。

它不会解码查询参数中的%2F。因此,如果编码数据在查询参数中,则可以使用:

requestUrl = "https://google.com/tools?feeds=http%3A%2F%2Fwww%2example%2Ecom%2F/crawlissues/";   
var request = (HttpWebRequest)WebRequest.Create(requestUrl);

1

有一个更简单的方法

var request=(HttpWebRequest)WebRequest.Create(Uri.EscapeUriString(requestUrl));
request.Headers.Add("Content-Transfer-Encoding","binary");

"在我这里运行得非常好"

0

2
谢谢,但URL已经被编码了,问题是有些东西正在对其进行解码。 - user275939
我有完全相同的问题。奇怪的是,在 Visual Studios 调试站点使用 IISExpress 运行时不解码的 URL,在使用真正的 IIS 运行时被解码了。这种解码会破坏 URL! - Bernd Wechner

0
尝试将请求方法从POST更改为GET。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接