Pas*_*wig 8 c# webrequest bad-request
我试图使用System.Web从服务器下载文件.它确实有效,但有些链接给我带来了麻烦.链接看起来像这样:
http://cdn.somesite.com/r1KH3Z%2FaMY6kLQ9Y4nVxYtlfrcewvKO9HLTCUBjU8IBAYnA3vzE1LGrkqMrR9Nh3jTMVFZzC7mxMBeNK5uY3nx5K0MjUaegM3crVpFNGk6a6TW6NJ3hnlvFuaugE65SQ4yM5754BM%2BLagqYvwvLAhG3DKU9SGUI54UAq3dwMDU%2BMl9lUO18hJF3OtzKiQfrC/the_file.ext
Run Code Online (Sandbox Code Playgroud)
代码看起来基本上是这样的:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(link);
WebResponse response = request.getResponse();
Run Code Online (Sandbox Code Playgroud)
getResponse()始终抛出异常(错误400错误请求).但是,我知道该链接有效,因为我可以使用Firefox下载该文件而不会出现问题.
我也尝试用Uri.UnescapeDataString(链接)解码链接,但该链接甚至不能在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
Run Code Online (Sandbox Code Playgroud)
我认为只有第一行是问题,因为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
Run Code Online (Sandbox Code Playgroud)
(%2F替换为/)
我发现Uri类自动解码url:Uri uri = new Uri(link); //链接未解码Debug.WriteLine(uri.ToString()); //链接在此解码.
我怎么能阻止这个?
在此先感谢您的帮助.
Bra*_*ger 19
默认情况下,Uri该类不允许URI中的转义/字符(%2f)(尽管在我阅读RFC 3986时这似乎是合法的).
Uri uri = new Uri("http://example.com/embed%2fded");
Console.WriteLine(uri.AbsoluteUri); // prints: http://example.com/embed/ded
Run Code Online (Sandbox Code Playgroud)
(注意:不要使用Uri.ToString来打印URI.)
根据Microsoft Connect上此问题的错误报告,此行为是设计使然,但您可以通过将以下内容添加到app.config或web.config文件来解决此问题:
<uri>
<schemeSettings>
<add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
</schemeSettings>
</uri>
Run Code Online (Sandbox Code Playgroud)
(由于WebRequest.Create(string)只是代表WebRequest.Create(Uri),无论您调用哪种方法,都需要使用此解决方法.)