开发者社区 问答 正文

OSS 返回:在 WebClient 请求期间发生异常

 string VERB="PUT";
            string Content_MD5="";
            string Content_Type = "application/x-www-form-urlencoded";
            string Date=DateTime.Now.ToUniversalTime().ToString("r");
            string CanonicalizedOSSHeaders="";
            string CanonicalizedResource = "/****/oss.txt";
            string tem = VERB + "\n"
            + Content_MD5 + "\n"
            + Content_Type + "\n"
            + Date + "\n"
            + CanonicalizedOSSHeaders
            + CanonicalizedResource;
            string Signature = Convert.ToBase64String(HmacSha1Sign(
            tem, AccessKey_Secret));

string  Authorization="OSS " + AccessKey_ID + ":" + Signature;
在计算待加密数据  Signature 值得到的结果和官方的SDK得到的字符串一样,但是提交上传的时候反馈:在 WebClient 请求期间发生异常

提交时的Headers值如下:

myWebClient.Headers.Add("Authorization", Authorization);
                myWebClient.Headers.Add("Host", "****.oss-cn-shanghai.aliyuncs.com");
                myWebClient.Headers.Add("Cache-control", "no-cache");
                myWebClient.Headers.Add("Date", Date);
                myWebClient.Headers.Add("Content_MD5", Content_MD5);
                myWebClient.Headers.Add("Content-Type", Content_Type);
                myWebClient.Headers.Add("CanonicalizedOSSHeaders", CanonicalizedOSSHeaders);
                myWebClient.Headers.Add("CanonicalizedResource", CanonicalizedResource);
//发起验证并上传文件
using (Stream postStream = myWebClient.OpenWrite("https://****.oss-cn-shanghai.aliyuncs.com/****/oss.txt", "PUT"))
                        {
                            if (postStream.CanWrite)
                            {
                                postStream.Write(files, 0, files.Length);

                            }
                        }
请问问题是出在哪里呢?

展开
收起
1919123055512610 2018-12-06 10:53:45 846 分享 版权
阿里云 AI 助理回答

从您提供的代码片段来看,您正在尝试使用.NET的WebClient类直接与阿里云对象存储服务(OSS)进行交互以上传文件。根据您的描述,计算签名的过程似乎没有问题,但请求时遇到了异常。这里有几个可能的问题点和建议:

  1. 时间戳不一致:确保服务器的时间是准确的,且与阿里云服务器时间相差不大。阿里云OSS对请求时间有严格要求,时间偏差可能导致签名验证失败。

  2. Content-MD5为空:在您的代码中,Content_MD5被初始化为空字符串。如果要上传的数据需要校验内容完整性,Content-MD5应该包含上传数据的MD5摘要值(Base64编码)。如果不需要校验,可以考虑是否真的需要这个头信息,或者按照OSS的要求处理它。

  3. Header设置问题:不是所有的自定义头部都需要添加到HTTP请求中。特别是"CanonicalizedOSSHeaders" 和 "CanonicalizedResource" 这两个字段,它们是用于构建签名字符串的一部分,并不是实际HTTP请求中的头部字段。请确保只添加有效的HTTP头部。

  4. 错误处理:您提到“在WebClient请求期间发生异常”,但未提供具体的异常信息。为了定位问题,请捕获并打印出具体的异常详情,这将有助于识别问题所在。

  5. 使用官方SDK:考虑到手动实现OSS请求的复杂性,推荐使用阿里云官方提供的.NET SDK来简化开发和减少错误。官方SDK已经处理了很多细节,如签名生成、重试逻辑等,能有效避免此类问题。

  6. 网络问题或URL错误:确认URL格式正确无误,且网络连接正常,没有防火墙或代理设置阻止请求。

  7. 权限问题:检查使用的AccessKey_ID和AccessKey_Secret是否有足够的权限执行PUT操作,以及Bucket和Object的ACL设置是否允许该操作。

综上所述,首先检查上述几点,尤其是时间同步、不必要的头部字段、以及具体异常信息。如果问题依旧,考虑采用阿里云OSS的.NET SDK来替换当前的手动实现方式。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答