[英]Cannot create Blob Container with Azure's REST API
我正在嘗試使用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;
}
您的請求失敗的原因是因為您沒有在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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.