- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我花了一整天的时间尝试解决 Amazon ECS(电子商务服务)API 的问题。
我已经在他们的站点上下载了使用 .NET 4.0 和 WCF 发送 SOAP 请求的示例
http://aws.amazon.com/code/Product-Advertising-API/3941
除了配置文件中的 AccessKeyID 和 SecretyKeyID 之外,我没有更改示例代码中的任何内容。
调用代码如下所示:
// Instantiate Amazon ProductAdvertisingAPI client
AWSECommerceServicePortTypeClient amazonClient = new AWSECommerceServicePortTypeClient();
// prepare an ItemSearch request
ItemSearchRequest request = new ItemSearchRequest();
request.SearchIndex = "Books";
request.Title = "WCF";
request.ResponseGroup = new string[] { "Medium"};
ItemSearch itemSearch = new ItemSearch();
itemSearch.Request = new ItemSearchRequest[] { request };
request.Condition = Condition.All;
itemSearch.AssociateTag = "";
itemSearch.AWSAccessKeyId = ConfigurationManager.AppSettings["accessKeyId"];
// send the ItemSearch request
ItemSearchResponse response = amazonClient.ItemSearch(itemSearch);
if (response != null)
{
// write out the results from the ItemSearch request
foreach (var item in response.Items[0].Item)
{
Console.WriteLine(item.ItemAttributes.Title);
}
}
Console.WriteLine("done...enter any key to continue>");
Console.ReadLine();
对 ItemSearch() 的调用返回一个空对象。我进一步研究了这一点,发现在 AmazongSigningMessageInspector 类中,AfterReceiveReply() 方法显示正在返回正确的 SOAP XML 响应和结果,所以我知道它正在调用服务并正确返回。出于某种原因,尽管我留下了 NULL ItemSearch 对象。
我的类(class)代码如下:
class AmazonSigningBehaviorExtensionElement : BehaviorExtensionElement
{
public AmazonSigningBehaviorExtensionElement()
{
}
public override Type BehaviorType
{
get
{
return typeof(AmazonSigningEndpointBehavior);
}
}
protected override object CreateBehavior()
{
return new AmazonSigningEndpointBehavior(AccessKeyId, SecretKey);
}
[ConfigurationProperty("accessKeyId", IsRequired = true)]
public string AccessKeyId
{
get { return (string)base["accessKeyId"]; }
set { base["accessKeyId"] = value; }
}
[ConfigurationProperty("secretKey", IsRequired = true)]
public string SecretKey
{
get { return (string)base["secretKey"]; }
set { base["secretKey"] = value; }
}
}
public class AmazonSigningEndpointBehavior : IEndpointBehavior {
private string _accessKeyId = "";
private string _secretKey = "";
public AmazonSigningEndpointBehavior()
{
this._accessKeyId = ConfigurationManager.AppSettings["accessKeyId"];
this._secretKey = ConfigurationManager.AppSettings["secretKey"];
}
public AmazonSigningEndpointBehavior(string accessKeyId, string secretKey) {
this._accessKeyId = accessKeyId;
this._secretKey = secretKey;
}
public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime clientRuntime) {
clientRuntime.MessageInspectors.Add(new AmazonSigningMessageInspector(_accessKeyId, _secretKey));
}
public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, EndpointDispatcher endpointDispatcher) { return; }
public void Validate(ServiceEndpoint serviceEndpoint) { return; }
public void AddBindingParameters(ServiceEndpoint serviceEndpoint, BindingParameterCollection bindingParameters) { return; }
}
public class AmazonSigningMessageInspector : IClientMessageInspector {
private string _accessKeyId = "";
private string _secretKey = "";
public AmazonSigningMessageInspector(string accessKeyId, string secretKey) {
this._accessKeyId = accessKeyId;
this._secretKey = secretKey;
}
public object BeforeSendRequest(ref Message request, IClientChannel channel) {
// prepare the data to sign
string operation = Regex.Match(request.Headers.Action, "[^/]+$").ToString();
DateTime now = DateTime.UtcNow;
string timestamp = now.ToString("yyyy-MM-ddTHH:mm:ssZ");
string signMe = operation + timestamp;
byte[] bytesToSign = Encoding.UTF8.GetBytes(signMe);
// sign the data
byte[] secretKeyBytes = Encoding.UTF8.GetBytes(_secretKey);
HMAC hmacSha256 = new HMACSHA256(secretKeyBytes);
byte[] hashBytes = hmacSha256.ComputeHash(bytesToSign);
string signature = Convert.ToBase64String(hashBytes);
// add the signature information to the request headers
request.Headers.Add(new AmazonHeader("AWSAccessKeyId", _accessKeyId));
request.Headers.Add(new AmazonHeader("Timestamp", timestamp));
request.Headers.Add(new AmazonHeader("Signature", signature));
return null;
}
public void AfterReceiveReply(ref Message reply, object correlationState)
{
}
}
我到处都看到这个问题,但没有人在任何地方发布修复程序。有人请帮我解决这个问题。
最佳答案
我的问题是我缺少关联标签。
itemSearch.AssociateTag = "213";
生成的代码肯定有问题,ItemSearchResponse 包含一个代码未公开的错误集合。正是通过查看检查器中的原始消息为我指明了正确的方向。
关于c# - 亚马逊产品广告 API ItemSearch 返回空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9448589/
我花了一整天的时间尝试解决 Amazon ECS(电子商务服务)API 的问题。 我已经在他们的站点上下载了使用 .NET 4.0 和 WCF 发送 SOAP 请求的示例 http://aws.ama
我正在使用 PHP PEAR 亚马逊包从 API 检索产品,我现在可以搜索书籍和 DVD,但我需要所有类别,问题是我找不到所有类别,例如家庭和花园。 我正在使用以下代码提取书籍: $result =
我正在使用亚马逊产品广告 API,我想检索一个类别的所有产品。我想知道的是,我是否可以只提供一个类别,而不将任何关键字传递到 ItemSearch 操作中,并检索完整的产品记录集,包括它们的子类别产品
ItemSearch返回的DetailPageURL似乎包含错误的ID /标记,而不是我请求搜索的关联ID。 我越来越: http://www.amazon.co.uk/gp/product/15
我编写了以下代码: from hashlib import sha256 from base64 import b64encode import hmac import urllib from tim
我正在尝试从亚马逊产品广告 API 获取销售排名。我正在使用 amazon_product gem 。 request = AmazonProduct["us"] request.configure
ItemSearch 操作是否有像偏移这样的参数?我需要获取 100 多个结果,我不介意是否必须执行更多查询。 我使用的参数如下: 'Service' => "AWSECommerceService"
我正在为 ItemSearch 使用 Amazon 文档中的一个简单示例,但出现了一个奇怪的错误: “远程服务器返回了意外响应:(400) 错误请求。” 这是代码: public static voi
我正在尝试为亚马逊广告 API (http://pypi.python.org/pypi/python-amazon-product-api/) 使用 Python 包装器,但是当我尝试执行 Item
我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收专辑封面。使用 C#,我找不到任何接近于此的示例。所有在线示例都已过时,不适用于 AWS 的较新版本。 最佳答案 Co
我是一名优秀的程序员,十分优秀!