Windows azure REST API列出容器问题

我正在尝试在我的windows azure存储帐户中列出容器。 但我有一个例外
“远程服务器返回错误:(403)服务器无法validation请求。请确保正确形成Authorization标头的值,包括签名..”

但是我按照给出的说明包含了签名,是否有人在我的代码中发现任何错误?

private static String SignThis(string StringToSign,string Key,string Account) { String signature = string.Empty; byte[] unicodeKey = Convert.FromBase64String(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( System.Globalization.CultureInfo.InvariantCulture, "{0} {1}:{2}", "SharedKey", Account, signature); return authorizationHeader; } static void ListContainers() { Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; string Key = @"MyStorageAccountKey"; string Account = @"MyStorageAccountName"; DateTime dt = DateTime.UtcNow; string dataStr = dt.ToString ("R",System.Globalization.CultureInfo.InvariantCulture); string StringToSign = String.Format("GET\n" + "\n" // content encoding + "\n" // content language + "\n" // content length + "\n" // content md5 + "\n" // content type + "\n" // date + "\n" // if modified since + "\n" // if match + "\n" // if none match + "\n" // if unmodified since + "\n" // range + "x-ms-date:" + dataStr + "\nx-ms-version:2014-02-14\n" // headers + "/{0}\ncomp:list", Account); string auth = SignThis(StringToSign, Key, Account); string method = "GET"; string urlPath = string.Format ("https://{0}.blob.core.windows.net/?comp=list", Account); Uri uri = new Uri(urlPath); HttpWebRequest reque = (HttpWebRequest)WebRequest.Create(uri); reque.Method = method; reque.Headers.Add("Authorization", auth); reque.Headers.Add("x-ms-date",dataStr); reque.Headers.Add("x-ms-version", "2014-02-14"); using (HttpWebResponse response = (HttpWebResponse) reque.GetResponse ()) { using (StreamReader reader = new StreamReader(response.GetResponseStream())) { string text = reader.ReadToEnd(); } } } 

编辑:字符串i用于生成签名

 GET x-ms-date:Tue, 14 Jul 2015 18:38:16 GMT x-ms-version:2014-02-14 /MyStorageAccountName/ comp:list 

编辑:我收到了exception响应:

 AuthenticationFailedServer failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:2fc74ef8-0001-0083-2664-be8850000000 Time:2015-07-14T18:38:18.0831721ZThe MAC signature found in the HTTP request '5rqWNl2i8kuZF6haCRqFr1S0viOM9eLjz4L/zU6GCsg=' is not the same as any computed signature. Server used following string to sign: 'GET x-ms-date:Tue, 14 Jul 2015 18:38:16 GMT x-ms-version:2014-02-14 /MyStorageAccountName/ comp:list'. 

最终编辑:在完成gauvrav指定的所有更改后,我发现我使用的存储键是错误的,在更换正确的存储键后,它工作正常。

此错误可能还有其他更改:请参阅此链接

请将您的StringToSign更改为:

  string StringToSign = String.Format("GET\n" + "\n" // content encoding + "\n" // content language + "\n" // content length + "\n" // content md5 + "\n" // content type + "\n" // date + "\n" // if modified since + "\n" // if match + "\n" // if none match + "\n" // if unmodified since + "\n" // range + "x-ms-date:" + dataStr + "\nx-ms-version:2014-02-14\n" // headers + "/{0}/\ncomp:list", Account);//Notice an extra "/" after "{0}" 

它缺少a / after帐户名占位符(上面代码中的最后一行)。 完成后,您应该能够看到以XML格式返回的容器列表。