2015-06-29 255 views
1

我一直收到來自Amazon Web服務的錯誤 - InvalidParameterValue Action或Operation查詢參數必須存在。亞馬遜網絡服務 - 簽名

我認爲這很可能是由於簽名不正確,因爲XML文檔和標題與我在其暫存區中進行的測試相匹配。

是否有什麼突出的不正確?

感謝,

克萊爾

private static string ConstructCanonicalQueryString(SortedDictionary<string, string> sortedParameters) 
    { 
     var builder = new StringBuilder(); 

     if (sortedParameters.Count == 0) 
     { 
      builder.Append(string.Empty); 
      return builder.ToString(); 
     } 

     foreach (var kvp in sortedParameters) 
     { 
      builder.Append(PercentEncodeRfc3986(kvp.Key)); 
      builder.Append("="); 
      builder.Append(PercentEncodeRfc3986(kvp.Value)); 
      builder.Append("&"); 
     } 

     var canonicalString = builder.ToString(); 
     return canonicalString.Substring(0, canonicalString.Length - 1); 
    } 


    private static string PercentEncodeRfc3986(string value) 
    { 
     value = HttpUtility.UrlEncode(string.IsNullOrEmpty(value) ? string.Empty : value, Encoding.UTF8); 

     if (string.IsNullOrEmpty(value)) 
     { 
      return string.Empty; 
     } 

     value = value.Replace("'", "%27") 
       .Replace("(", "%28") 
       .Replace(")", "%29") 
       .Replace("*", "%2A") 
       .Replace("!", "%21") 
       .Replace("%7e", "~") 
       .Replace("+", "%20") 
       .Replace(":", "%3A"); 

     var sbuilder = new StringBuilder(value); 

     for (var i = 0; i < sbuilder.Length; i++) 
     { 
      if (sbuilder[i] != '%') 
      { 
       continue; 
      } 

      if (!char.IsLetter(sbuilder[i + 1]) && !char.IsLetter(sbuilder[i + 2])) 
      { 
       continue; 
      } 

      sbuilder[i + 1] = char.ToUpper(sbuilder[i + 1]); 
      sbuilder[i + 2] = char.ToUpper(sbuilder[i + 2]); 
     } 

     return sbuilder.ToString(); 
    } 

    public string SignRequest(Dictionary<string, string> parametersUrl, Dictionary<string, string> 

parametersSignture) 
    { 
     var secret = Encoding.UTF8.GetBytes(parametersSignture["Secret"]); 
     var signer = new HMACSHA256(secret); 

     var pc = new ParamComparer(); 
     var sortedParameters = new SortedDictionary<string, string>(parametersUrl, pc); 
     var orderedParameters = ConstructCanonicalQueryString(sortedParameters); 

     var builder = new StringBuilder(); 
     builder.Append(parametersSignture["RequestMethod"]) 
       .Append(" \n") 
       .Append(parametersSignture["EndPoint"]) 
       .Append("\n") 
       .Append("/\n") 
       .Append(orderedParameters); 

     var stringToSign = builder.ToString(); 
     var toSign = Encoding.UTF8.GetBytes(stringToSign); 

     var sigBytes = signer.ComputeHash(toSign); 
     var signature = Convert.ToBase64String(sigBytes); 

     return signature.Replace("=", "%3D").Replace("/", "%2F").Replace("+", "%2B"); 
    } 

    public class ParamComparer : IComparer<string> 
    { 
     public int Compare(string p1, string p2) 
     { 
      return string.CompareOrdinal(p1, p2); 
     } 
    } 
+0

能否請您減少位代碼的大小,只顯示了最相關的部分,併發布錯誤信息呢? – Ivan

+0

簽名助手使用上述所有代碼,問題可能出現在任何子方法中,將其刪除會有幫助嗎?錯誤消息位於第一行或帖子中,看起來像是一般錯誤。當我搜索這個時候,接近它的唯一的事情就是談論簽名。 –

+0

我儘可能減少了它:-) –

回答

0

的問題是,該行動是沒有正確地納入請求