【问题标题】:Get all files from azure blob container using rest API, I am already tried this code but i am facing 403 error使用 rest API 从 azure blob 容器中获取所有文件,我已经尝试过此代码,但我面临 403 错误
【发布时间】:2018-04-06 08:36:17
【问题描述】:

我已经使用 RestAPI 获取容器 使用 RestAPI 从 Blob 存储容器中获取所有文件。

我已经在使用这个 API。

   private const string ListofFilesURL = "https://{0}.blob.core.windows.net/{1}?restype=container&comp=list&maxresults=10";

我的代码如下,

 public async void ListofFilessinBlob(string containername)
     {

            string Requesturl = string.Format(ListofFilesURL, storageAccount, containername);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Requesturl);
            string now = DateTime.UtcNow.ToString("R");
            request.Method = "GET";
            request.Headers.Add("x-ms-version", "2015-12-11");
            request.Headers.Add("x-ms-date", now);
            request.Headers.Add("Authorization", AuthorizationHeader2("GET", now, request, storageAccount, storageKey, containername));
            // var response =  request.GetResponseAsync().Result;
            await request.GetResponseAsync();
            using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
            {
                resp.StatusCode.ToString();
                WebHeaderCollection header = resp.Headers;

                var encoding = ASCIIEncoding.ASCII;
                using (var reader = new System.IO.StreamReader(resp.GetResponseStream(), encoding))
                {
                    string responseText = reader.ReadToEnd();

                }
            }

        }

我的授权头方法如下,

private string AuthorizationHeader2(string method, string now, HttpWebRequest request, string storageAccount, string storageKey, string containerName) {

    string headerResource = $"x-ms-date:{now}\nx-ms-version:2015-12-11";
    string canonicalizedResource = $"/{storageAccount}/{containerName}\ncomp:list\nmaxresults:10";
    var contentEncoding = "";
    var contentLanguage = "";
    var contentLength = "";
    var contentMd5 = "";
    var contentType = "";
    var date = "";
    var ifModifiedSince = "";
    var ifMatch = "";
    var ifNoneMatch = "";
    var ifUnmodifiedSince = "";
    var range = "";
    var stringToSign = $"{method}\n{contentEncoding}\n{contentLanguage}\n{contentLength}\n{contentMd5}\n{contentType}\n{date}\n{ifModifiedSince}\n{ifMatch}\n{ifNoneMatch}\n{ifUnmodifiedSince}\n{range}\n{headerResource}\n{canonicalizedResource}";
    var signature = "";
    using (var hmacSha256 = new HMACSHA256(Convert.FromBase64String(storageKey)))
    {
        var dataToHmac = Encoding.UTF8.GetBytes(stringToSign);
        signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac));
    }
    String AuthorizationHeader = String.Format("{0} {1}:{2}", "SharedKey", storageAccount, signature);
    return AuthorizationHeader;
}

您可以看到此错误。我已经试过这段代码了。

【问题讨论】:

  • 请在此处阅读标题为Constructing the Canonicalized Resource String 的部分:docs.microsoft.com/en-us/rest/api/storageservices/…
  • @GauravMantri 。谢谢你的答复。我已经添加了授权标头。但在得到回应时,我面临着异常(403)。你能检查我的代码吗:)
  • 您不应该只使用共享访问签名而不是费心去散列密钥吗?然后你也可以在邮递员中轻松测试它。
  • @MikeWise 或使用 .Net SDK。我真的不明白当你有一个优秀且维护良好的 SDK 可用时,为什么还要经历实现 REST API 的麻烦。
  • 我最近去 REST 开发了一个统一应用程序。虽然有一些类似于 Mono 的 Azure SDK,但它显然不是那么好,而且我不想添加所有代码只是为了保存一个简单的 blob - REST 调用就像 10 行代码,不需要新的库。

标签: azure azure-storage azure-blob-storage


【解决方案1】:

您的canonicalizedResource 字符串不包括所有查询字符串参数。应该是:

string canonicalizedResource = $"/{storageAccount}/{containerName}\ncomp:list\nmaxresults:10\nrestype:container";

来自文档链接:

【讨论】:

  • 非常感谢@GauravMantri。这是作品。你说得对,我错过了那个。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2022-08-17
  • 2022-01-11
相关资源
最近更新 更多