簡體   English   中英

C#WebRequest.getResponse():400錯誤請求

[英]C# WebRequest.getResponse(): 400 Bad Request

我試圖使用System.Web從服務器下載文件。 它確實有效,但有些鏈接給我帶來了麻煩。 鏈接看起來像這樣:

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(鏈接)解碼鏈接,但該鏈接甚至不能在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 = new Uri(link); //鏈接未解碼Debug.WriteLine(uri.ToString()); //鏈接在此解碼。

我怎么能阻止這個?

在此先感謝您的幫助。

默認情況下, Uri類不允許URI中的轉義/字符( %2f )(盡管在我閱讀RFC 3986時這似乎是合法的)。

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

(注意: 不要使用Uri.ToString來打印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中已經發生了變化。 默認情況下,您現在可以使用轉義斜杠。 我在這里的評論中發布了更多關於此信息(包括屏幕截圖)的信息: 使用網址編碼的斜杠獲取網址

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM