在Winrt和Rest API中使用Azure,签名有问题

在Winrt和Rest API中使用Azure,签名有问题,rest,azure,windows-runtime,Rest,Azure,Windows Runtime,我正在尝试在winrt中使用azure存储。由于azure存储客户端与winrt不兼容,我正在尝试使用azure的rest API。我花了很长时间才把签名弄对,我可以用另一双眼睛来帮助我看清哪里出了问题 Azure帐户提供了一个名称和密钥属性,此方法立即建立请求,只需列出所有blob '专用异步void BuildHTTPRequest(AzureAccount帐户) { System.Net.Http.HttpClient请求=新的HttpClient() 这将设置用于签名的标题 public

我正在尝试在winrt中使用azure存储。由于azure存储客户端与winrt不兼容,我正在尝试使用azure的rest API。我花了很长时间才把签名弄对,我可以用另一双眼睛来帮助我看清哪里出了问题

Azure帐户提供了一个名称和密钥属性,此方法立即建立请求,只需列出所有blob

'专用异步void BuildHTTPRequest(AzureAccount帐户) { System.Net.Http.HttpClient请求=新的HttpClient()

这将设置用于签名的标题

public string CanonicalizeHeaders(System.Net.Http.Headers.HttpRequestHeaders hdrCollection)
{
    StringBuilder retVal = new StringBuilder();// Look for header names that start with "x-ms-"  // Then sort them in case-insensitive manner. 

    List<string> httpStorageHeaderNameArray = new List<string>();
    Dictionary<string, string> ht = new Dictionary<string, string>();

    foreach (var key in hdrCollection)
    {
        if (key.Key.ToLowerInvariant().StartsWith("x-ms-", StringComparison.Ordinal))
        {
            if (ht.ContainsKey(key.Key.ToLowerInvariant()))
            {
                ht[key.Key.ToLowerInvariant()] = string.Format("{0},{1}", ht[key.Key.ToLowerInvariant()],
                    hdrCollection.FirstOrDefault(m => m.Key == key.Key).ToString().Replace("\n", string.Empty).Replace("\r", string.Empty).Trim());
            }
            else
            {
                httpStorageHeaderNameArray.Add(key.Key.ToLowerInvariant());
                ht.Add(key.Key.ToLowerInvariant(),
                hdrCollection.FirstOrDefault(m => m.Key == key.Key).Value.FirstOrDefault().ToString().Replace("\n", string.Empty).Replace("\r", string.Empty).Trim());
            }
        }
    }

    httpStorageHeaderNameArray.Sort();// Now go through each header's values in the sorted order and append them to the canonicalized string.  
    foreach (string key in httpStorageHeaderNameArray)
    {
        retVal.AppendFormat("{0}:{1}\n", key.Trim(), ht[key]);
    }
    return retVal.ToString();
}
公共字符串规范化标头(System.Net.Http.Headers.HttpRequestHeaders hdrCollection)
{
StringBuilder retVal=new StringBuilder();//查找以“x-ms-”开头的标题名称//然后以不区分大小写的方式对其排序。
List httpStorageHeaderNameArray=新列表();
字典ht=新字典();
foreach(hdrCollection中的var键)
{
if(key.key.ToLowerInvariant().StartsWith(“x-ms-”,StringComparison.Ordinal))
{
if(ht.ContainsKey(key.key.ToLowerInvariant())
{
ht[key.key.ToLowerInvariant()]=string.Format(“{0},{1}”),ht[key.key.ToLowerInvariant()],
hdrCollection.FirstOrDefault(m=>m.Key==Key.Key).ToString().Replace(“\n”,string.Empty).Replace(“\r”,string.Empty).Trim());
}
其他的
{
httpStorageHeaderNameArray.Add(key.key.ToLowerInvariant());
ht.Add(key.key.ToLowerInvariant(),
hdrCollection.FirstOrDefault(m=>m.Key==Key.Key).Value.FirstOrDefault().ToString().Replace(“\n”,string.Empty).Replace(“\r”,string.Empty).Trim());
}
}
}
httpStorageHeaderNameArray.Sort();//现在按排序顺序检查每个标头的值,并将它们附加到规范化字符串中。
foreach(httpStorageHeaderNameArray中的字符串键)
{
AppendFormat(“{0}:{1}\n”,key.Trim(),ht[key]);
}
返回retVal.ToString();
}

最新版本的存储客户端库支持WinRT。您可以在此处了解更多信息:。我所做的是从Github下载源代码:,在VS 2012中打开解决方案,并构建
RT
项目以获取必要的
winmd
文件

说到您的问题,我相信您遇到了这个问题,因为您正在为规范化资源字符串传递一个空字符串:

string authValue = string.Format(fmtStringToSign, "GET", "", "", "", hdr, "")

有关创建规范化资源字符串的更多详细信息,请参见此链接:。

您正式成为我的英雄。我真的不确定资源字符串中应该包含什么内容。尽管winrt支持的提示是我想要的:)这将节省大量工作。谢谢!
string authValue = string.Format(fmtStringToSign, "GET", "", "", "", hdr, "")