2010-09-15 7 views
2

У меня проблема с преобразованием URL-адресов автоматически при их обработке.Проблема с доступом к URL-адресам с экранированными символами в C#

Uri myUri = new Uri(this.url); 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri); 
    request.ProtocolVersion = HttpVersion.Version10; 
    request.Method = "GET"; 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

Извинения для длинных URL-адресов В этом случае: this.url правильно

(https://zencoder-live.s3.amazonaws.com:443/ec03a97b1f726d8ee65774313a100db5%2Fa54779efdf5d1f64ac82954c870beb12.mp4?Signature=nrc0U65Pe3PiORokhAscndLdP68%3D&Expires=1284625412&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ) 

В то время как URL внутри объекта Uri не

({https://zencoder-live.s3.amazonaws.com/ec03a97b1f726d8ee65774313a100db5/a54779efdf5d1f64ac82954c870beb12.mp4?Signature=nrc0U65Pe3PiORokhAscndLdP68=&Expires=1284625412&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ} 

Обратите внимание на отличия " % 2F "->"/". То же самое происходит, если я кормлю this.url прямо в WebRequest, и я получаю ошибку 403 от сервера S3, потому что подписи больше не совпадают.

Есть ли способ предотвратить появление таких преобразований?

EDIT: Как это настольное приложение (жаль не упоминая ранее) HTTPUtilities не доступен, но класс URI имеет сходную функцию, поэтому я попытался что

this.url = Uri.EscapeUriString (это. URL); и this.url получает значение:

https://zencoder-live.s3.amazonaws.com:443/e09517d7841a9047f9ff7a2f015d2596%252F1e8e7e8e1a85665bc7e9b146ce444a88.mp4?Signature=6bs5vfOBUDeHeX2HdmrvVGDnDjE%253D&Expires=1284627002&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ 

и затем из HttpWebRequest Объект:

https://zencoder-live.s3.amazonaws.com/e09517d7841a9047f9ff7a2f015d2596%252F1e8e7e8e1a85665bc7e9b146ce444a88.mp4?Signature=6bs5vfOBUDeHeX2HdmrvVGDnDjE%253D&Expires=1284627002&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ 

HttpWebRequest объект не превратили его вовсе, так что URI все еще неверны. % 2F преобразуется в% 252F и не возвращается обратно к% 2F при создании объекта Uri.

ответ

2

Возможно, вы захотите ознакомиться с классом HttpUtility, который предлагает методы UrlDecode/UrlEncode.

+0

Я видел это, но он не работает должным образом. Пожалуйста, перейдите в исходный вопрос – paullb

+0

Я попытался импортировать класс HttpUtility, но он просто преобразует всю строку, которую отклоняет Uri/HttpWebRequest: «https% 3a% 2f% 2fzencoder-live.s3.amazonaws.com% 3a443% 2f2e33f7d90e54b1e8816eb1d7d80e6b08% 252Fe80da01b484e4c4167f944e1952a0577 .mp4% 3fSignature% 3d08VGDqDybKH8QN5lDKHzn46Fy2M% 253D% 26Expires% 3d1284688887% 26AWSAccessKeyId% 3dAKIAIIEXNN2J4YDTRUVQ " – paullb

1

%2F в первом URL-адресе правильно преобразован в /.
Чтобы остановить это, вы должны сначала HttpUtility.UrlEncode() обеспечить кодировку %.

Uri myUri = new Uri(HttpUtility.UrlEncode(this.url)); 
+0

Спасибо за идею, но поскольку я создаю консольное приложение, HttpUtility недоступно. См. Править. Я попробовал Uri.EscapeUriString, но, похоже, не сделал этого. – paullb

+1

Я пробовал свой код, меняя агент пользователя и используя множество разных кодированных версий URL-адреса, и он по-прежнему делает ту же ошибку «403 Forbidden» для меня тоже. Единственное, что у меня есть, это то, что безопасное подключение к порту не ведет себя. – Codesleuth

+0

Спасибо, что просмотрели ссылки! В чем бы он не мог себя вести (я довольно новичок в C#, но опыт в PHP) – paullb

Смежные вопросы