【问题标题】:Cannot create Blob Container with Azure's REST API无法使用 Azure 的 REST API 创建 Blob 容器
【发布时间】:2015-04-23 15:02:18
【问题描述】:

我正在尝试使用 C# 和 REST API(在 Xamarin.Android 中)创建 Blob 容器。我可以将 blob 上传到现有容器,但似乎无法通过 REST 创建容器。错误是 (403) 服务器无法验证请求。确保 Authorization 标头的值正确形成,包括签名。 创建授权标头在上传 blob 时有效,因此它必须与我构建要签名的容器字符串的方式一致,但对于我的生活我找不到问题。代码如下:

    private async Task<bool> CreateContainer(string containerName)
    {          
        String requestMethod = "PUT";
        String msVersion = "2009-09-19";
        string dt = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);

        String canonicalizedHeaders = String.Format("x-ms-date:{0}\nx-ms-version:{1}", dt, msVersion);
        String canonicalizedResource = String.Format("/{0}/{1}\nrestype:container", AzureStorageConstants.Account, containerName);
        String stringToSign = String.Format("{0}\n\n\n\n\n\n\n\n\n\n\n\n{1}\n{2}", requestMethod, canonicalizedHeaders, canonicalizedResource);

        string auth = SignThis(stringToSign);   
        string urlPath = string.Format("https://{0}.blob.core.windows.net/{1}?restype=container", AzureStorageConstants.Account, containerName);
        Uri uri = new Uri(urlPath);

        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-ms-date", dt);
        client.DefaultRequestHeaders.Add("x-ms-version", "2009-09-19");
        client.DefaultRequestHeaders.Add("Authorization", auth);

        HttpContent empty = null;
        HttpResponseMessage response = await client.PutAsync(uri, empty);

        return response.IsSuccessStatusCode;
    }

    private static String SignThis(String StringToSign)
    {
        String signature = string.Empty;
        byte[] unicodeKey = Convert.FromBase64String(AzureStorageConstants.Key);
        using (HMACSHA256 hmacSha256 = new HMACSHA256(unicodeKey))
        {
            Byte[] dataToHmac = System.Text.Encoding.UTF8.GetBytes(StringToSign);
            signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac));
        }

        String authorizationHeader = String.Format(
              CultureInfo.InvariantCulture,
              "{0} {1}:{2}",
              "SharedKey",
              AzureStorageConstants.Account,
              signature);

        return authorizationHeader;
    }

【问题讨论】:

    标签: c# rest azure xamarin azure-blob-storage


    【解决方案1】:

    您的请求失败的原因是您没有在您的stringToSign 中包含内容长度,即使它包含在请求中(HttpClient 包含它并将其值设置为0)。这导致签名不匹配。要解决此问题,请在您的 stringToSign 中包含内容长度:

    String stringToSign = String.Format("{0}\n\n\n0\n\n\n\n\n\n\n\n\n{1}\n{2}", requestMethod, canonicalizedHeaders, canonicalizedResource);
    

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 2021-09-02
      • 1970-01-01
      • 2018-11-21
      • 2019-02-03
      • 2014-10-16
      • 2018-10-25
      • 2020-07-20
      • 2013-09-21
      相关资源
      最近更新 更多