【背景】
折腾:
【基本解决】用C#实现AWS的API中的ItemLookup
期间,已经下载并安装了AWS SDK for .NET。
接下来,尝试使用此Amazon的库,去实现对应的ItemLookup。
【折腾过程】
1.参考:
去在VS1020中新建一个AWS Console Project:
2.然后输入Access Key ID等信息:
3.生成的代码如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Amazon;
using Amazon.EC2;
using Amazon.EC2.Model;
using Amazon.SimpleDB;
using Amazon.SimpleDB.Model;
using Amazon.S3;
using Amazon.S3.Model;
namespace AwsConsoleApp1
{
class Program
{
public static void Main(string[] args)
{
Console.Write(GetServiceOutput());
Console.Read();
}
public static string GetServiceOutput()
{
StringBuilder sb = new StringBuilder(1024);
using (StringWriter sr = new StringWriter(sb))
{
sr.WriteLine("===========================================");
sr.WriteLine("Welcome to the AWS .NET SDK!");
sr.WriteLine("===========================================");
// Print the number of Amazon EC2 instances.
AmazonEC2 ec2 = AWSClientFactory.CreateAmazonEC2Client(RegionEndpoint.USWest2);
DescribeInstancesRequest ec2Request = new DescribeInstancesRequest();
try
{
DescribeInstancesResponse ec2Response = ec2.DescribeInstances(ec2Request);
int numInstances = 0;
numInstances = ec2Response.DescribeInstancesResult.Reservation.Count;
sr.WriteLine("You have " + numInstances + " Amazon EC2 instance(s) running in the US-East (Northern Virginia) region.");
}
catch (AmazonEC2Exception ex)
{
if (ex.ErrorCode != null && ex.ErrorCode.Equals("AuthFailure"))
{
sr.WriteLine("The account you are using is not signed up for Amazon EC2.");
sr.WriteLine("You can sign up for Amazon EC2 at http://aws.amazon.com/ec2");
}
else
{
sr.WriteLine("Caught Exception: " + ex.Message);
sr.WriteLine("Response Status Code: " + ex.StatusCode);
sr.WriteLine("Error Code: " + ex.ErrorCode);
sr.WriteLine("Error Type: " + ex.ErrorType);
sr.WriteLine("Request ID: " + ex.RequestId);
sr.WriteLine("XML: " + ex.XML);
}
}
sr.WriteLine();
// Print the number of Amazon SimpleDB domains.
AmazonSimpleDB sdb = AWSClientFactory.CreateAmazonSimpleDBClient(RegionEndpoint.USWest2);
ListDomainsRequest sdbRequest = new ListDomainsRequest();
try
{
ListDomainsResponse sdbResponse = sdb.ListDomains(sdbRequest);
if (sdbResponse.IsSetListDomainsResult())
{
int numDomains = 0;
numDomains = sdbResponse.ListDomainsResult.DomainName.Count;
sr.WriteLine("You have " + numDomains + " Amazon SimpleDB domain(s) in the US-East (Northern Virginia) region.");
}
}
catch (AmazonSimpleDBException ex)
{
if (ex.ErrorCode != null && ex.ErrorCode.Equals("AuthFailure"))
{
sr.WriteLine("The account you are using is not signed up for Amazon SimpleDB.");
sr.WriteLine("You can sign up for Amazon SimpleDB at http://aws.amazon.com/simpledb");
}
else
{
sr.WriteLine("Caught Exception: " + ex.Message);
sr.WriteLine("Response Status Code: " + ex.StatusCode);
sr.WriteLine("Error Code: " + ex.ErrorCode);
sr.WriteLine("Error Type: " + ex.ErrorType);
sr.WriteLine("Request ID: " + ex.RequestId);
sr.WriteLine("XML: " + ex.XML);
}
}
sr.WriteLine();
// Print the number of Amazon S3 Buckets.
AmazonS3 s3Client = AWSClientFactory.CreateAmazonS3Client(RegionEndpoint.USWest2);
try
{
ListBucketsResponse response = s3Client.ListBuckets();
int numBuckets = 0;
if (response.Buckets != null &&
response.Buckets.Count > 0)
{
numBuckets = response.Buckets.Count;
}
sr.WriteLine("You have " + numBuckets + " Amazon S3 bucket(s) in the US Standard region.");
}
catch (AmazonS3Exception ex)
{
if (ex.ErrorCode != null && (ex.ErrorCode.Equals("InvalidAccessKeyId") ||
ex.ErrorCode.Equals("InvalidSecurity")))
{
sr.WriteLine("Please check the provided AWS Credentials.");
sr.WriteLine("If you haven't signed up for Amazon S3, please visit http://aws.amazon.com/s3");
}
else
{
sr.WriteLine("Caught Exception: " + ex.Message);
sr.WriteLine("Response Status Code: " + ex.StatusCode);
sr.WriteLine("Error Code: " + ex.ErrorCode);
sr.WriteLine("Request ID: " + ex.RequestId);
sr.WriteLine("XML: " + ex.XML);
}
}
sr.WriteLine("Press any key to continue...");
}
return sb.ToString();
}
}
}调试运行结果是,3个示例,都出错:
=========================================== =========================================== Caught Exception: You are not subscribed to this service. Please go to http://aws.amazon.com to subscribe. Response Status Code: Unauthorized Error Code: OptInRequired Error Type: Unknown Request ID: bae99725-79b4-4850-946f-b43a96ff1d67 XML: <?xml version="1.0" encoding="UTF-8"?> <Response><Errors><Error><Code>OptInRequired</Code><Message>You are not subscribed to this service. Please go to http://aws.amazon.com to subscribe.</Message></Error></Errors><RequestID>bae99725-79b4- 4850-946f-b43a96ff1d67</RequestID></Response> Caught Exception: Subscription check failed. Please sign up for Amazon SimpleDB service. Error Code: SubscriptionCheckFailed Error Type: Unknown Request ID: 7596a4d6-3305-cc36-2652-76c824b3a5fe XML: <?xml version="1.0"?> <Response><Errors><Error><Code>SubscriptionCheckFailed</Code><Message>Subscription check failed. Please sign up for Amazon SimpleDB service.</Message></Error></Errors><RequestID>7596a4d6-3305-cc36-265 2-76c824b3a5fe</RequestID></Response> Caught Exception: Your account is not signed up for the S3 service. You must sign up before you can use S3. Error Code: NotSignedUp Request ID: B3C78A53611A5924 XML: <?xml version="1.0" encoding="UTF-8"?> <Error><Code>NotSignedUp</Code><Message>Your account is not signed up for the S3 service. You must sign up before you can use S3.</Message><RequestId>B3C78A53611A5924</RequestId><HostId>t1vuXxSv2r180q bV/OnaDmv3XzVV/4DK2NyJD/4wCPg1MOLzuWT3xR99Lb16EcHB</HostId></Error> Press any key to continue… |
因为我自己没注册相关服务。
4.想办法,参考别人代码,去试试ItemLookup,但是结果找不到AWSECommerceService和ItemLookup:
【已解决】已装AWS SDK for .NET,但是C#中找不到AWSECommerceService和ItemLookup
5.另外,先参考了:
C# search amazon example with new amazon service
某人回复说到,2011年11月后,好像对于所有的request,都要加上一个Associate Tag的,否则貌似返回都是null和错误。
6.然后就可以继续去写代码了。
7.又参考:
http://flyingpies.wordpress.com/2009/08/13/signing-amazon-product-advertising-api-cwcf-part-2/
下载了:
AmazonProductAdvtApiWcfSample.zip, 324KB, 8/1/2009
然后参考其项目,把Amazon.ECS.Addons中的三个cs文件:
AmazonHeader.cs
AmazonSigningEndpointBehavior.cs
AmazonSigningMessageInspector.cs
都添加进来了,然后才可以找到AmazonSigningEndpointBehavior
8.期间代码调试无法正常获得response,后来参考:
找到:
Product Advertising API Change Details
得知:
| Associate Tag Parameter: Every request made to the API should include a valid Associate Tag. Any request that does not contain a valid Associate Tag will be rejected with an appropriate error message. For details on the Associate Tag parameter, please refer to our Developer guide. |
即,必须包括Associate Tag才可以的。
所以,去:
https://affiliate-program.amazon.com/
注册一个。
9.后来,用代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AwsWinformApiDemo.AWSECommerceService;
using System.ServiceModel;
using Async;
namespace AwsWinformApiDemo
{
public partial class AmazonAws : Form
{
private const string accessKeyId = "xxx";
private const string secretKey = "yyy";
private const string associateTag = "zzz";
public AmazonAws()
{
InitializeComponent();
}
private void AmazonAws_Load(object sender, EventArgs e)
{
// //AWSECommerceServicePortTypeClient amazonClient = new AWSECommerceServicePortTypeClient();
//http://stackoverflow.com/questions/8142909/c-sharp-search-amazon-example-with-new-amazon-service
BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
binding.MaxReceivedMessageSize = int.MaxValue;
AWSECommerceServicePortTypeClient amazonClient = new AWSECommerceServicePortTypeClient(
binding,
new EndpointAddress("https://webservices.amazon.com/onca/soap?Service=AWSECommerceService"));
// add authentication to the ECS client
amazonClient.ChannelFactory.Endpoint.Behaviors.Add(new AmazonSigningEndpointBehavior(accessKeyId, secretKey));
ItemLookup lookup = new ItemLookup();
ItemLookupRequest lookupReq = new ItemLookupRequest();
ItemLookupResponse lookupResp = new ItemLookupResponse();
lookup.AWSAccessKeyId = secretKey;
lookup.AssociateTag = associateTag;
//http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/ItemLookup.html
lookupReq.IdType = ItemLookupRequestIdType.ASIN; //Amazon Standard Identification Number
//http://www.amazon.com/gp/product/B0083PWAPW
lookupReq.ItemId = new string[] { "B0083PWAPW" };
//http://docs.aws.amazon.com/AWSECommerceService/latest/DG/OfferSummaries.html
lookupReq.ResponseGroup = new string[] { "OfferSummary" };
//http://stackoverflow.com/questions/6460936/amazon-product-advertising-api-item-lookup-request-working-example
lookupReq.SearchIndex = "All";
lookup.Request = new ItemLookupRequest[] { lookupReq };
lookupResp = amazonClient.ItemLookup(lookup);
MessageBox.Show(lookupResp.ToString());
////https://forums.aws.amazon.com/message.jspa?messageID=318807
//BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
//binding.MaxReceivedMessageSize = int.MaxValue;
//binding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
//AWSECommerceServicePortTypeClient client = new AWSECommerceServicePortTypeClient(
// binding,
// new EndpointAddress("https://webservices.amazon.com/onca/soap?Service=AWSECommerceService"));
// //new EndpointAddress("https://aws.amazonaws.com/onca/soap"));
//client.ChannelFactory.Endpoint.Behaviors.Add(new AmazonSigningEndpointBehavior(accessKeyId, secretKey));
//ItemLookupRequest[] request = new ItemLookupRequest[1];
//request[0] = new ItemLookupRequest();
//request[0].ItemId = new string[] { "0762744499" };
//ItemLookup itemLookup = new ItemLookup();
//itemLookup.Request = request;
//itemLookup.AWSAccessKeyId = accessKeyId;
//itemLookup.AssociateTag = associateTag;
//ItemLookupResponse response = new ItemLookupResponse();
//response = client.ItemLookup(itemLookup);
//MessageBox.Show(response.ToString());
}
}
}还是不行。
不仅仅是无法获得lookupResp,而且是,对于这一行的调试,都无法执行到。好像是由于异步执行的原因。
10.参考:
Amazon API, Product Advertising API , ItemSearch, C#
->
search items with .NET : ItemSearchResponse always null
下载到:
结果发现只有两个文件:AWSECommerceService.wsdl和Reference.cs
不是完整的项目,没啥参考价值。
因为这两个内容,之前都已经通过
http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl
添加进来了,且都已经是最新的了。
11.随便试试,去配置一下已加的那个服务:
右击AWSECommerceService->Configure Service Reference:
然后再去运行代码试试,看看能否debug到。
结果问题依旧。
【总结】
暂时是:
通过AWS的SDK,搞不定;
通过那个AWSECommerceServicePortTypeClient,也搞不定;
所以,放弃此方向的折腾。
后续折腾参见: