Uri uri = new Uri("xxxx");
HttpWebRequest httpRequest = HttpWebRequest.Create(uri) as HttpWebRequest;
httpRequest.Method = "GET";
StringBuilder strBuilder = new StringBuilder();
strBuilder.Append("GET\n\n\n");
String gmtTime = ToGMTFormat(DateTime.UtcNow);
strBuilder.Append(gmtTime);
strBuilder.Append("\n\n");
strBuilder.Append("/yszmetadata/firstobject");
String signatureStr = strBuilder.ToString();
String signature = ComputeSignature(AccessKeySecret, strBuilder.ToString());
String authorString = "OSS " AccessKeyID ":" signature;
httpRequest.Headers.Add("Authorization", ReEncode(authorString, "utf-8", "iso-8859-1"));
MethodInfo mf = typeof(WebHeaderCollection).GetMethod("AddInternal", BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string), typeof(string) }, null);
mf.Invoke(httpRequest.Headers, new object[] { "Date", ReEncode(gmtTime, "utf-8", "iso-8859-1") });
WebResponse webRespones = httpRequest.GetResponse();
上面的代码有和问题,AccessKeyID和AccessKeySecret都是对的,用.net sdk可以正确访问,直接用HttpWebRequest就不行,不知哪个地方没写好
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从您提供的代码片段来看,您尝试使用.NET的HttpWebRequest类直接发起一个HTTP GET请求到阿里云OSS(Object Storage Service),并手动实现了签名过程。如果使用此代码无法成功访问,而使用.NET SDK可以正常工作,可能的原因有以下几点:
签名计算问题:确保您的ComputeSignature方法正确实现了OSS签名算法。OSS签名涉及对请求字符串进行特定格式的排序、编码和哈希处理,任何微小的差异都可能导致签名不匹配。请对照阿里云OSS官方文档中的签名生成步骤检查您的实现。
字符编码问题:在构建签名字符串和添加HTTP头时,您进行了多次字符编码转换。确保这些转换是必要的,并且正确执行。特别是ReEncode方法的实现需要确保不会引入错误或不兼容的编码。
Header设置问题:您通过反射来设置Date头,这通常不是推荐的做法,因为标准库提供了公开的方法来设置请求头。尽管这可能不是直接导致失败的原因,但建议直接使用httpRequest.Headers["Date"] = gmtTime;来设置日期头,以避免潜在的反射调用问题。
Content-Type和Accept头:虽然未在代码中显示,但某些OSS操作可能需要正确的Content-Type和/或Accept头。确保根据OSS API的要求设置了这些头信息。
超时和重试策略:直接使用HttpWebRequest时,要确保考虑了网络不稳定情况下的重试逻辑以及合理的超时设置,这些在SDK中通常是默认配置好的。
错误处理:请捕获并检查httpRequest.GetResponse()处可能抛出的异常,这将提供关于失败原因的具体信息。
建议: - 首先,详细检查和测试签名生成逻辑。 - 使用Fiddler或Postman等工具与您的.NET代码发出的请求进行对比,确认所有头部、URL参数及签名是否完全一致。 - 考虑使用阿里云官方.NET SDK,它已经封装好所有必要的细节,减少出错的可能性,并简化代码维护。
如果问题依旧,建议分享更具体的错误信息或日志,以便进一步分析。