2016-03-15 213 views
1

我正在尝试连接到亚马逊MWS API。我有这些信息与我: String accessKeyId =“”; String secretAccessKey =“”; String merchantId =“”; String marketplaceId =“”; 我在vs2012 C#中创建了一个web表单,并在按钮点击时添加了上述变量,但是如何添加对marketplacewebservice的引用?我想要了解我那里列出的产品的销售信息。我是否需要添加一些文件,是否有任何由他们提供的需要添加的文件/ dll。 请指教。连接到亚马逊MWS

编辑:我已经下载了这个MWSOrdersCSharpClientLibrary-2013-09-01。 V293335039并从dist文件夹中添加了两个dll的引用。以下是获取订单详细信息的其他代码:

private void GetOrders() 
    { 
     MarketplaceWebServiceOrdersConfig config = new MarketplaceWebServiceOrdersConfig(); 
     config.ServiceURL = "https://mws.amazonservices.com/Orders/2011-01-01"; 

     MarketplaceWebServiceOrdersClient service = new MarketplaceWebServiceOrdersClient(accessKeyId, secretAccessKey, applicationName, applicationVersion, config); 

     ListOrdersRequest request = new ListOrdersRequest(); 
     request.SellerId = sellerID; 

     List<string> mpiList = new List<string>(); 
     mpiList.Add(marketplaceId); 

     request.MarketplaceId = mpiList; 

     request.LastUpdatedAfter = DateTime.UtcNow.AddDays(-1); 
     bool retryRequest = true; 
     do 
     { 
      try 
      { 
       ListOrdersResponse response = new ListOrdersResponse(); 
       response = service.ListOrders(request); 

       if (response.IsSetListOrdersResult()) 
       { 
        if (response.ListOrdersResult.IsSetOrders()) 
        { 
         foreach (Order order in response.ListOrdersResult.Orders) 
         { 
          Response.Write(order.AmazonOrderId); 
         } 
        } 
       } 

       retryRequest = false; 
      } 
      catch (MarketplaceWebServiceOrdersException ex) 
      { 
       if (ex.ErrorCode.Contains("RequestThrottled")) 
       { 
        retryRequest = true; 
        System.Threading.Thread.Sleep(60000); 
       }     
      } 
     } while (retryRequest == false); 

    } 

这不会返回任何订单明细,实际上会进入节流错误。

回答

2

使用Amazon .NET SDK。下载有一些教程和示例文件,它们将指导您如何连接并执行所有这些“初始设置”。查看下面的链接以下载SDK。一旦你完成了教程,我们可以帮助你解决更具体的问题。

您将需要使用订单或报告API来访问销售信息。长期来看,您会希望使用报告API,因为使用Orders API很难获取大量数据,但订购API在您初始时更容易学习。所以..我会开始使用Orders API,然后在您对系统工作方式有所了解之后再转到Reports API。

Orders API Libraries

下载C#的客户端库,并检查了SRC/MarketplaceWebServiceOrders/MarketplaceWebServiceOrdersSample.cs

在上述文件中,你可能会想尝试InvokeGetOrder()只需在您的相关项添加到accessKeysecretKey ,将你的SellerID添加到InvokeGetOrder()函数中,如果有的话,添加一个mwsAuthToken。 (如果您没有身份验证令牌,则可能已经过时,只需从代码中删除mwsAuthToken行)。

完成所有工作后,您只需提供一个amazonOrderID,该函数将检索与该订单相关的详细信息。 InvokeListOrders()是开始学习的另一个好功能。

编辑

一旦你的示例程序的窍门,你可以添加所提供的DLL到您的自定义项目,任何样本来源的你可能需要添加,以帮助构建各种在函数调用中使用的对象。

编辑

我看行..的第一件事是你的serviceURL不正确。对于直播网站,请使用https://mws.amazonservices.com

看来您的代码的其余部分格式完好。我会在捕获物上设置一个断点,并确切知道发生了什么。如果服务异常没有被限制,你的例程将会自由旋转,直到你点击节流帽,这是你所看到的情况,但是在节流之前应该有多个节拍。 Exception.Message将提供有关问题的信息。

此外,我会将Thread.Sleep置于任何条件之外的do-while循环中。如果没有某种睡眠来减缓日常工作,你将很快超过允许的限制范围。简单地说,处理节流可能是有效沟通亚马逊的最难的部分。我通常实际上允许发生油门,像下面做一些事情:

try 
{ 
    response = _service.GetReportListByNextToken(request); 
} 
catch (MarketplaceWebServiceException ex) 
{ 
    bool success = false; 
    for (int i = 0; i < 5 && !success; i++) 
    { 
     System.Threading.Thread.Sleep(3000); 
     try 
     { 
      response = _service.GetReportListByNextToken(request); 
      success = true; 
     } 
     catch (MarketplaceWebServiceException newEx) 
     { 
      success = false; 
     } 
    } 
    if (response == null) 
    { 
     Console.WriteLine("GetReportListByNextToken failed. Exceeded Throttling limits."); 
     //Don't throw an error, since there may be reports that we still want to process. 
    } 

} 

请记住,每个睡眠是依赖于您正在执行呼叫。此外,有时候,我会根据错误是否与节流有关而进行两次单独睡眠。

编辑

它看起来像下面这样(集成到你原来的代码示例)

private void GetOrders() 
    { 
     MarketplaceWebServiceOrdersConfig config = new MarketplaceWebServiceOrdersConfig(); 
     config.ServiceURL = "https://mws.amazonservices.com/"; 

     MarketplaceWebServiceOrdersClient service = new MarketplaceWebServiceOrdersClient(accessKeyId, secretAccessKey, applicationName, applicationVersion, config); 

     ListOrdersRequest request = new ListOrdersRequest(); 
     request.SellerId = sellerID; 

     List<string> mpiList = new List<string>(); 
     mpiList.Add(marketplaceId); 

     request.MarketplaceId = mpiList; 

     request.LastUpdatedAfter = DateTime.UtcNow.AddDays(-1); 
     bool retryRequest = true; 
     ListOrdersResponse response = new ListOrdersResponse(); 
     try 
      { 
       response = service.ListOrders(request); 
      } 
      catch (MarketplaceWebServiceException ex) 
      { 
       bool success = false; 
       for (int i = 0; i < 5 && !success; i++) 
       { 
        System.Threading.Thread.Sleep(30000); 
        try 
        { 
         response = service.ListOrders(request); 
         success = true; 
        } 
        catch (MarketplaceWebServiceException newEx) 
        { 
         success = false; 
        } 
       } 
       if (response == null) 
       { 
        Console.WriteLine("ListOrders failed. Exceeded Throttling limits."); 
        //Don't throw an error, since there may be reports that we still want to process. 
       } 
      } 
     if (response.IsSetListOrdersResult()) 
     { 
      if (response.ListOrdersResult.IsSetOrders()) 
      { 
       foreach (Order order in response.ListOrdersResult.Orders) 
       { 
        Response.Write(order.AmazonOrderId); 
       } 
      } 
     } 
} 

这是你需要实现什么大致的轮廓。基本上你把try-catch放在任何函数调用周围,这个函数调用会向amazon发出请求,并将sleep函数调整为函数调用的限制要求。我把30秒的睡眠时间放到了捕获中,因为这次调用有60秒的刷新时间,而且我们基本上有6个周期来允许调用不被阻塞,所以它应该在最多2个函数调用中进行调节,然后去通过成功。取决于您的应用程序,这可能需要调整到接近60秒或降低,这取决于您需要程序的响应程度(想想如果在刷新之前1秒钟进行节流,那么您可以有最长的等待时间如果你使用15秒钟,你的最长等待时间约为1.25分钟,你必须平衡这一点,因为你不想让亚马逊满足要求(和一些电话有小时限制,所以你真的不想达到这个限制)

+0

感谢Nate M的回复我已经下载了他们的c#api的命令,并在我的代码中添加了dll,然后我创建了一个函数已经添加了上面的内容,但仍然无法看到任何订单信息 – user1254053

+0

查看您的代码,并会稍后与您取得联系 –

+0

Nate M,谢谢,请分享您的f ull代码 - 我需要把这个你上面写的这个尝试放在哪里。 – user1254053