C# WebRequest.getResponse (): 400 плохой запрос
Я пытаюсь загрузить файл с сервера с помощью системы.Сеть. Это действительно работает, но некоторые ссылки дают мне проблемы. Ссылки выглядят следующим образом:
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.
другие ссылки работают отлично таким образом.. только это не сработает.
Edit:
хорошо, я нашел что-то с помощью 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 (ссылка) декодирует 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 заменяется на/)
другой редактировать:
I выяснилось, что класс Uri автоматически декодирует url-адрес: Uri uri = новый Uri (ссылка); / / ссылка не декодируется Отлаживать.WriteLine (uri.ToString ()); / / ссылка декодируется здесь.
как я могу предотвратить это?
заранее спасибо за вашу помощь.
2 ответов
по умолчанию Uri
класс не позволит сбежавшего /
символ (%2f
) в URI (хотя это кажется законным в моем чтении RFC 3986).
Uri uri = new Uri("http://example.com/embed%2fded");
Console.WriteLine(uri.AbsoluteUri); // prints: http://example.com/embed/ded
(Примечание: не используйте Uri.Метод toString для печати URIs.)
по словам сообщение об ошибке для этой проблемы в Microsoft Connect это поведение по дизайну, но вы можете обойти его, добавив следующее в свое приложение.config или web.конфиг файл:
<uri>
<schemeSettings>
<add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
</schemeSettings>
</uri>
(поскольку WebRequest.Create(string)
просто делегатам WebRequest.Create(Uri)
, вы должны использовать этот метод, независимо от того, какой метод вы звоните.)
теперь это изменилось в .NET 4.5. По умолчанию теперь можно использовать экранированные косые черты. Я разместил больше информации об этом (включая скриншоты) в комментариях здесь:получение URL-адреса с URL-кодированной косой чертой