Amazon web services 亚马逊网络服务-签名
我从Amazon web服务收到一个错误-InvalidParameterValue 操作或操作查询参数必须存在 我认为这很可能是因为签名不正确,因为XML文档和标题与我在草稿行中做的测试相匹配 有什么不正确的地方吗 谢谢 克莱尔Amazon web services 亚马逊网络服务-签名,amazon-web-services,hash,amazon,encode,signature,Amazon Web Services,Hash,Amazon,Encode,Signature,我从Amazon web服务收到一个错误-InvalidParameterValue 操作或操作查询参数必须存在 我认为这很可能是因为签名不正确,因为XML文档和标题与我在草稿行中做的测试相匹配 有什么不正确的地方吗 谢谢 克莱尔 private static string ConstructCanonicalQueryString(SortedDictionary<string, string> sortedParameters) { var bui
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);
}
}
私有静态字符串构造函数CanonicalQueryString(SortedDictionary sortedParameters)
{
var builder=新的StringBuilder();
如果(sortedParameters.Count==0)
{
Append(string.Empty);
返回builder.ToString();
}
foreach(分类参数中的var kvp)
{
builder.Append(PercentEncodeRfc3986(kvp.Key));
生成器。追加(“=”);
builder.Append(PercentEncoderRFC3986(kvp.Value));
建筑商。追加(“&”);
}
var canonicalString=builder.ToString();
返回canonicalString.Substring(0,canonicalString.Length-1);
}
专用静态字符串PercentEncoderRFC3986(字符串值)
{
value=HttpUtility.UrlEncode(string.IsNullOrEmpty(value)?string.Empty:value,Encoding.UTF8);
if(string.IsNullOrEmpty(value))
{
返回字符串。空;
}
值=值。替换(“,“%27”)
.替换(“(”,“%28”)
.替换(“)”,“%29”)
.替换(“*”,“%2A”)
.替换(“!”,“%21”)
.替换(“%7e”和“~”)
.替换(“+”,“%20”)
.替换(“:”,“%3A”);
var sbuilder=新的StringBuilder(值);
对于(变量i=0;i
问题是请求中没有正确包含操作问题是请求中没有正确包含操作您能否请将代码的大小减小一点,只显示最相关的部分,并发布错误消息?签名助手使用上述所有代码,问题可能在任何子方法中,删除它是否有帮助?错误消息位于第一行或帖子上,看起来像一般错误。当我在谷歌上搜索时,唯一接近它的是关于签名。我已经尽可能地减少了它:-)错误告诉你错误:“InvalidParameterValue动作或操作查询参数必须存在。”您需要指定正在执行的操作。奇怪的是,操作就在那里。请您将代码的大小减小一点,只显示最相关的部分,并发布错误消息?签名助手使用上述所有代码,问题可能在任何子方法中,删除它是否有帮助?错误消息位于第一行或帖子上,看起来像一般错误。当我在谷歌上搜索时,唯一接近它的是关于签名。我已经尽可能地减少了它:-)错误告诉你错误:“InvalidParameterValue操作或操作查询参数必须存在。”你需要指定你正在执行的操作。奇怪的是,操作就在那里