【问题标题】:Issue regarding accessing URLs with escaped characters in C#关于在 C# 中使用转义字符访问 URL 的问题
【发布时间】:2010-09-15 08:26:48
【问题描述】:

我在处理 URL 时遇到了自动转换的问题。

Uri myUri = new Uri(this.url);

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

为长网址道歉 在这种情况下:this.url 是正确的

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

而 Uri 对象内的 url 不是

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

注意 "%2F" --> "/" 的区别。 如果我将 this.url 直接输入到 WebRequest 中,也会发生同样的情况,因为签名不再匹配,所以我从 S3 服务器收到 403 错误。

有没有办法防止这种转变发生?

编辑: 由于这是一个桌面应用程序(抱歉之前没有提及)HTTPUtilities 不可用,但 URI 类具有类似的功能,所以我尝试了

this.url = Uri.EscapeUriString(this.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,并且在创建 Uri 对象时不会转换回 %2F。

【问题讨论】:

    标签: c# webrequest


    【解决方案1】:

    您可能想看看HttpUtility 类,它提供了 UrlDecode / UrlEncode 方法。

    【讨论】:

    • 我看到了,但它似乎没有按预期工作。请参阅对原始问题的编辑
    • 我尝试导入 HttpUtility 类,但它只是转换了 Uri/ HttpWebRequest 拒绝的整个字符串:“https%3a%2f%2fzencoder-live.s3.amazonaws.com%3a443%2f2e33f7d90e54b1e8816eb1d7d80e6b08%252Fe80da01b484ec4 mp4%3fSignature%3d08VGDqDybKH8QN5lDKHzn46Fy2M%253D%26Expires%3d1284688887%26AWSAccessKeyId%3dAKIAIIEXNN2J4YDTRUVQ"
    【解决方案2】:

    第一个 URL 中的%2F 被正确转换为/
    为了阻止这种情况,您必须首先 HttpUtility.UrlEncode() 确保 % 已编码。

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

    【讨论】:

    • 感谢您的想法,但由于我正在创建控制台应用程序 HttpUtility 不可用。见编辑。我确实尝试过 Uri.EscapeUriString 但似乎没有这样做。
    • 我已经尝试了您的代码,更改了用户代理并使用了许多不同的 URL 编码版本,但它仍然对我执行相同的 403 Forbidden 错误。我唯一的建议是安全端口连接不正常。
    • 感谢您试用这些链接!在什么情况下它不能表现出来(我对 C# 相当陌生,但在 PHP 方面经验丰富)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多