c#Amazon Api请求失败

c#Amazon Api请求失败,c#,winforms,amazon-web-services,C#,Winforms,Amazon Web Services,我正在尝试创建一个HTTP url请求,以通过其ASIN数组获取Amazon项目。出于同样的原因,我在Objective-c代码中使用了相同的代码,它工作得非常完美 但每次我试图访问chrome中的url时,我都会收到这样的消息: 我们计算的请求签名与您提供的签名不匹配。检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅维修文档 这是我正在使用的代码: private void GetFinalUrlForAsinArray(ArrayList asinArr) { String

我正在尝试创建一个HTTP url请求,以通过其ASIN数组获取Amazon项目。出于同样的原因,我在Objective-c代码中使用了相同的代码,它工作得非常完美

但每次我试图访问chrome中的url时,我都会收到这样的消息:

我们计算的请求签名与您提供的签名不匹配。检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅维修文档

这是我正在使用的代码:

private void GetFinalUrlForAsinArray(ArrayList asinArr)
{
    String timeStamp = GetTimeStamp();

    String amazonAPIUrl = "http://webservices.amazon.com/onca/xml?";

    ArrayList param = new ArrayList();
    param.Add("AWSAccessKeyId=myawsaccesskeyid");

    param.Add("AssociateTag=myassociatetag");

    param.Add("IdType=ASIN");
    param.Add(string.Join(",", asinArr.ToArray()));
    param.Add("Operation=ItemLookup");
    param.Add("ResponseGroup=ItemAttributes,Offers");
    param.Add("Service=AWSECommerceService");
    param.Add(String.Format("Timestamp={0}", timeStamp));

    amazonAPIUrl += string.Join("&", param.ToArray());

    string queryString = new System.Uri(amazonAPIUrl).Query;
    var queryDictionary = HttpUtility.ParseQueryString(queryString);

    ArrayList queryItemsNew = new ArrayList();
    foreach (var query in queryDictionary)
    {
        String name = HttpUtility.UrlEncode((string)query);
        String value = HttpUtility.UrlEncode((string)queryDictionary.Get((string)query));
        queryItemsNew.Add(String.Format("{0}={1}", name,value));
    }

    String path = string.Join("&", queryItemsNew.ToArray());

    String finalPath = String.Format("GET\nwebservices.amazon.com\n/onca/xml\n{0}",path);

    string signature = HmacSha256Digest(finalPath);

    String finalUrl = String.Format("http://webservices.amazon.com/onca/xml?{0}&Signature={1}", path, signature);
}

private String GetTimeStamp()
{
    DateTime d = DateTime.UtcNow;
    String str = d.ToString("yyyy-MM-dd''T''HH:mm:ss''Z''");

    return str;
}

private static string HmacSha256Digest(string message)
{
    UTF8Encoding encoding = new UTF8Encoding();
    HMACSHA256 hmac = new HMACSHA256(encoding.GetBytes(mysecret));
    string signature = Convert.ToBase64String(hmac.ComputeHash(encoding.GetBytes(message)));
    String sigEncoded = Uri.EscapeDataString(signature);
    return sigEncoded;
}

查看API文档后,您似乎错过了此处的ItemId键:

param.Add(string.Join(",", asinArr.ToArray()));
我猜你的意思是:

param.Add("ItemId=" + string.Join(",", asinArr.ToArray()));

除此之外,它看起来符合规范,我注意到的另一件事是该示例的URL编码为大写,即%3A,而不是C#默认值%3A。

查看API文档后,您似乎错过了此处的ItemId键:

param.Add(string.Join(",", asinArr.ToArray()));
我猜你的意思是:

param.Add("ItemId=" + string.Join(",", asinArr.ToArray()));

在其他方面,它看起来符合规范,我注意到的另一件事是该示例的URL编码为大写,即%3A,而不是C#默认值%3A。

ArrayList
在.NET 2.0发布时被弃用。您应该使用
string[]
List
是否有不使用.NET的AWS SDK的原因<使用.NET 2.0时,code>ArrayList已被弃用。您应该使用
string[]
List
是否有不使用.NET的AWS SDK的原因?