C#WebRequest.getResponse():400错误请求

C#WebRequest.getResponse():400错误请求,c#,webrequest,bad-request,C#,Webrequest,Bad Request,我正在尝试使用System.Web从服务器下载文件。 它实际上是有效的,但是一些链接给我带来了麻烦。链接如下所示: http://cdn.somesite.com/r1KH3Z%2FaMY6kLQ9Y4nVxYtlfrcewvKO9HLTCUBjU8IBAYnA3vzE1LGrkqMrR9Nh3jTMVFZzC7mxMBeNK5uY3nx5K0MjUaegM3crVpFNGk6a6TW6NJ3hnlvFuaugE65SQ4yM5754BM%2BLagqYvwvLAhG3DKU9SGUI54UAq

我正在尝试使用System.Web从服务器下载文件。 它实际上是有效的,但是一些链接给我带来了麻烦。链接如下所示:

http://cdn.somesite.com/r1KH3Z%2FaMY6kLQ9Y4nVxYtlfrcewvKO9HLTCUBjU8IBAYnA3vzE1LGrkqMrR9Nh3jTMVFZzC7mxMBeNK5uY3nx5K0MjUaegM3crVpFNGk6a6TW6NJ3hnlvFuaugE65SQ4yM5754BM%2BLagqYvwvLAhG3DKU9SGUI54UAq3dwMDU%2BMl9lUO18hJF3OtzKiQfrC/the_file.ext
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(link);
WebResponse response = request.getResponse();
代码基本上如下所示:

http://cdn.somesite.com/r1KH3Z%2FaMY6kLQ9Y4nVxYtlfrcewvKO9HLTCUBjU8IBAYnA3vzE1LGrkqMrR9Nh3jTMVFZzC7mxMBeNK5uY3nx5K0MjUaegM3crVpFNGk6a6TW6NJ3hnlvFuaugE65SQ4yM5754BM%2BLagqYvwvLAhG3DKU9SGUI54UAq3dwMDU%2BMl9lUO18hJF3OtzKiQfrC/the_file.ext
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(link);
WebResponse response = request.getResponse();
getResponse()始终引发异常(错误400错误请求)。 但是,我知道这个链接是有效的,因为我可以用Firefox毫无问题地下载文件

我还尝试用Uri.UnescapeDataString(link)解码链接,但该链接在Firefox中甚至无法工作

其他链接以这种方式工作得非常好。。只是这些不行

编辑: 好吧,我用wireshark发现了一些东西:

如果我使用Firefox打开链接,则会发送:

&ME3@"dM*PNyAo PA:]GET /r1KH3Z%2FaMY6kLQ9Y4nVxYp5DyNc49t5kJBybvjbcsJJZ0IUJBtBWCgri3zfTERQught6S8ws1a%2BCo0RS5w3KTmbL7i5yytRpn2QELEPUXZTGYWbAg5eyGO2yIIbmGOcFP41WdrFRFcfk4hAIyZ7rs4QgbudzcrJivrAaOTYkEnozqmdoSCCY8yb1i22YtEAV/epd_outpost_12adb.flv HTTP/1.1
Host: cdn.somesite.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
我认为只有第一行是问题所在,因为WebRequest.Create(link)解码url:

&MEz.@!dM/nP9@~P>.GET /r1KH3Z/aMY6kLQ9Y4nVxYp5DyNc49t5kJBybvjbcsJJZ0IUJBtBWCgri3zfTERQught6S8ws1a%2BCo0RS5w3KTmbL7i5yytRpn2QELEPUXZTGYWbAg5eyGO2yIIbmGOcFP41WdrFRFcfk4hAIyZ7rs6Mmh1EsQQ4vJVYUwtbLBDNx9AwCHlWDfzfSWIHzaaIo/epd_outpost_12adb.flv HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0
Host: cdn.somesite.com
(%2F替换为/)

另一编辑: 我发现Uri类会自动解码url: Uri=新的Uri(链接)//链接未被解码 Debug.WriteLine(uri.ToString())//链接在这里被解码

我怎样才能防止这种情况


提前感谢您的帮助。

默认情况下,
Uri
类将不允许在Uri中使用转义的
/
字符(
%2f
)(即使在我的阅读中这似乎是合法的)

(注意:打印URI。)

根据Microsoft Connect上的,此行为是出于设计,但您可以通过将以下内容添加到app.config或web.config文件来解决此问题:

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


(由于
WebRequest.Create(string)
只是委托给
WebRequest.Create(Uri)
,因此无论调用哪种方法,您都需要使用此解决方法。)

这在.NET 4.5中已经发生了更改。默认情况下,现在可以使用转义斜杠。我在这里的评论中发布了更多信息(包括截图):

如果你没有给出真实的url,很难说。试着看看浏览器为获得响应而进行的通信(使用Live HTTP headers插件或Wireshark之类的工具),这应该会提示您在请求中更改什么。Uri类就是这样做的,它有一个带参数dontEscape的构造函数,但它已经过时,不做任何事情。谢谢,我刚刚发现了这一点。有没有办法阻止它这样做?非常感谢!这解决了我的问题。谢谢你的Uri.ToString()提示。