Issue regarding accessing URLs with escaped characters in C#
I have an issue with URLs being transformed automatically as they are being processed.
Uri myUri = new Uri(this.url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri);
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Apologies for the long urls In this case: this.url is correct
(https://zencoder-live.s3.amazonaws.com:443/ec03a97b1f726d8ee65774313a100db5%2Fa54779efdf5d1f64ac82954c870beb12.mp4?Signature=nrc0U65Pe3PiORokhAscndLdP68%3D&Expires=1284625412&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ)
Whereas the url inside the Uri object is not
({https://zencoder-live.s3.amazonaws.com/ec03a97b1f726d8ee65774313a100db5/a54779efdf5d1f64ac82954c870beb12.mp4?Signature=nrc0U65Pe3PiORokhAscndLdP68=&Expires=1284625412&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ}
Note the differences of "%2F" --> "/". The same happens if I feed this.url straight into WebRequest and I get a 403 error from the S3 server because the signatures no longer match.
Is there a way to prevent such transformations from occuring?
EDIT: As this is a desktop application (sorry for not mentioning earlier) HTTPUtilities is not available but the URI class has a similar function so I tried that
this.url = Uri.EscapeUriString(this.url); and this.url gets set to:
https://zencoder-live.s3.amazonaws.com:443/e09517d7841a9047f9ff7a2f015d2596%252F1e8e7e8e1a85665bc7e9b146ce444a88.mp4?Signature=6bs5vfOBUDeHeX2HdmrvVGDnDjE%253D&Expires=1284627002&AWSAccessKeyId=AKIAIIEXNN2J4YDTRUVQ
and then from within the HttpWebRequest Object:
https://zencoder-live.s3.amazonaws.com/e09517d7841a9047f9ff7a2f015d2596%252F1e8e7e8e1a85665bc7e9b146ce444a88.mp4?Signature=6bs5vfOBUDeHeX2HdmrvVGDnDjE%253D&Expires=1284627002&AWSAccessKeyId=A开发者_开发知识库KIAIIEXNN2J4YDTRUVQ
The HttpWebRequest object has not transformed it at all so the URI is still incorrect. %2F gets converted to %252F and does not get converted back to %2F on creation of the Uri Object.
You might want to have a look at the HttpUtility class, which offers UrlDecode / UrlEncode methods.
%2F
in the first URL is being correctly transformed to /
.
In order to stop this you must first HttpUtility.UrlEncode()
to ensure the %
is encoded.
Uri myUri = new Uri(HttpUtility.UrlEncode(this.url));
精彩评论