Web Services 使用.NET连接到亚马逊

h43kikqp  于 2023-03-13  发布在  .NET
关注(0)|答案(1)|浏览(179)

我正试图通过这样连接到亚马逊,只返回一条数据:

using System;
using System.Collections.Generic;
using System.Text;
using AmazonProductAdvtApi;
using Microsoft.Web.Services3.Addressing;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Net;

namespace AmazonProductAdvtApi
{
    class HmacSample
    {
        // Note: protocol must be https for signed SOAP requests.
        const String DESTINATION    = "https://ecs.amazonaws.com/onca/soap?Service=AWSECommerceService";

        // Set your AWS Access Key ID and AWS Secret Key here.
        // You can obtain them at:
        // http://aws-portal.amazon.com/gp/aws/developer/account/index.html?action=access-key
        const String MY_AWS_ID = "MY_SECRET"; //yes it's there in  the real code
        const String MY_AWS_SECRET = "ANOTHER_SECRET"; //yes it's there in the real code

        // Select an item you wish to inspect and provide it's ASIN here:
        const String ITEM_ID = "0345505344";

        static void Main(string[] args)
        {
            // If you are using a debugging proxy like Fiddler to capture SOAP
            // envelopes, and you get SSL Certificate warnings, uncomment the 
            // following line:
            // ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

            // Create an ItemLookup request, with ResponseGroup "Small"
            // and using the item ID provided above.
            ItemLookup itemLookup = new ItemLookup();
            itemLookup.AWSAccessKeyId = MY_AWS_ID;

            ItemLookupRequest itemLookupRequest = new ItemLookupRequest();
            itemLookupRequest.ItemId = new String[] { ITEM_ID };
            itemLookupRequest.ResponseGroup = new String[] { "Small", "AlternateVersions" };
            itemLookup.Request = new ItemLookupRequest[] { itemLookupRequest };

            // create an instance of the serivce
            AWSECommerceService api = new AWSECommerceService();

            // set the destination
            api.Destination = new Uri(DESTINATION);

            // apply the security policy, which will add the require security elements to the
            // outgoing SOAP header
            AmazonHmacAssertion amazonHmacAssertion = new AmazonHmacAssertion(MY_AWS_ID, MY_AWS_SECRET);
            api.SetPolicy(amazonHmacAssertion.Policy());

            // make the call and print the title if it succeeds
            try
            {
                ItemLookupResponse itemLookupResponse = api.ItemLookup(itemLookup);
                Item item = itemLookupResponse.Items[0].Item[0];
                System.Console.WriteLine(item.ItemAttributes.Title);
            }
            catch (Exception e)
            {

                System.Console.Error.WriteLine(e);
            }

            // we're done
            System.Console.WriteLine("HMAC sample finished. Hit Enter to terminate.");
            System.Console.ReadLine();
        }
    }
}

我得到了下面的异常。

{"WSE101: An asynchronous operation raised an exception."}
"Microsoft.Web.Services3.AsynchronousOperationException: WSE101: An asynchronous operation raised an exception. ---> System.Net.WebException: The remote server returned an error: (403) Forbidden.

Server stack trace: 
   at System.Net.HttpWebRequest.GetResponse()
   at Microsoft.Web.Services3.Messaging.SoapHttpTransport.Send(SoapEnvelope message, EndpointReference destination, SoapHttpChannelOptions options)
   at Microsoft.Web.Services3.Messaging.SoapHttpOutputChannel.Send(SoapEnvelope message)
   at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.EndInvokeHelper(Message reqMsg, Boolean bProxyCase)
   at System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(Object NotUsed, MessageData& msgData)
   at Microsoft.Web.Services3.Messaging.SoapOutputChannel.SendDelegate.EndInvoke(IAsyncResult result)
   at Microsoft.Web.Services3.Messaging.SoapOutputChannel.EndSend(IAsyncResult result)
   at Microsoft.Web.Services3.Messaging.SoapSender.EndSend(IAsyncResult result)
   at Microsoft.Web.Services3.Messaging.SoapClient.SoapClientAsyncResult.OnSendComplete(IAsyncResult result)
   --- End of inner exception stack trace ---
   at Microsoft.Web.Services3.AsyncResult.End(IAsyncResult result)
   at Microsoft.Web.Services3.Messaging.SoapClient.SendRequestResponse(String methodname, SoapEnvelope envelope)
   at Microsoft.Web.Services3.Messaging.SoapClient.SendRequestResponse(String methodname, Object obj)
   at AmazonProductAdvtApi.AWSECommerceService.ItemLookup(ItemLookup ItemLookup1) in C:\\Documents and Settings\\agordon\\My Documents\\AmazonProductAdvtApiSampleCSharpSoap\\Client\\src\\AmazonProductAdvtApi.cs:line 218
   at AmazonProductAdvtApi.HmacSample.Main(String[] args) in C:\\Documents and Settings\\agordon\\My Documents\\AmazonProductAdvtApiSampleCSharpSoap\\Sample\\src\\HmacSample.cs:line 88"

你能帮我解决这个问题吗?我不明白我做错了什么。我正在使用亚马逊网站上的一个例子来检索产品信息。它来自他们的产品广告API。
有人知道他们是否有更受支持和新的东西吗?

monwx1rj

monwx1rj1#

您是否已将id和secret更改为aws id/secret?

// Set your AWS Access Key ID and AWS Secret Key here.
    // You can obtain them at:
    // http://aws-portal.amazon.com/gp/aws/developer/account/index.html?action=access-key
    const String MY_AWS_ID = "secret";
    const String MY_AWS_SECRET = "anothersecret";

相关问题