BigCommerce API 连接问题/开始是间歇性的,现在更频繁

Posted

技术标签:

【中文标题】BigCommerce API 连接问题/开始是间歇性的,现在更频繁【英文标题】:BigCommerce API Connection Problems / Began as Intermittent, now more frequent 【发布时间】:2017-07-21 08:04:12 【问题描述】:

很长一段时间以来,我一直在使用 API 将订单推送到客户的 BigCommerce 商店,但是,BigCommerce 最近开始拒绝连接和/或关闭连接。

我一直无法找到问题的根源,我希望有人经历过和/或可以帮助找到问题的根源。

以下是我们现在对所有 Big Commerce API 请求的响应:

消息:底层连接已关闭:发送时发生意外错误。

InnerException: System.IO.IOException: 身份验证失败,因为远程方已关闭传输流。在 System.Net.Security.SslState.StartReadFrame(字节 [] 缓冲区,Int32 readBytes,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.StartReceiveBlob(字节 [] 缓冲区, AsyncProtocolRequest asyncRequest) 在 System.Net.Security.SslState.StartSendBlob(字节 [] 传入,Int32 计数,AsyncProtocolRequest asyncRequest)在 System.Net.Security.SslState.ForceAuthentication(布尔接收第一, Byte[] 缓冲区,AsyncProtocolRequest asyncRequest) 在 System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult 懒惰的结果)在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态)在 System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult 结果)在 System.Net.TlsStream.Write(Byte[] 缓冲区,Int32 偏移量,Int32 大小) 在 System.Net.ConnectStream.WriteHeaders(布尔异步)

    req = (HttpWebRequest)WebRequest.Create(baseURL);
    req.AllowAutoRedirect = true;
    req.ContentType = "application/json";
    req.Accept = "application/json";
    req.Method = "GET";

    req.Headers.Add("X-Auth-Client", clientID);
    req.Headers.Add("X-Auth-Token", AccessToken);
    req.Headers.Add("Authorization", authValue);

    using (WebResponse resp = req.GetResponse()) 
        if (req.HaveResponse && resp != null) 
            using (var reader = new StreamReader(resp.GetResponseStream())) 
                    jsonResponse = reader.ReadToEnd();
                
            
        
    

【问题讨论】:

似乎与 SSL 相关。你可以忽略证书验证吗?还是显示ssl相关代码? 【参考方案1】:

现在每次都持续发生吗?如果不是,频率是多少?当您说“拒绝连接和/或关闭连接”时,您是否会在每种情况下看到两种不同的错误响应?

我之前从 BC 看到过类似的消息,但只是来自格式错误的请求,这听起来不像你的情况,因为代码之前运行良好。回家后我会进行一些测试,看看是否有类似的问题,然后我会比较代码以查看是否存在差异。

编辑:发布我正在使用的代码的非常简化的版本可能会更有帮助。我有一个工作方法 BigCommerceGet,它是从我的代码中的多个位置调用的:

private string BigCommerceGet(string URL)

    System.Net.HttpWebRequest req = (HttpWebRequest)WebRequest.Create(baseUrl + URL);
    req.Credentials = new NetworkCredential(_username, _api_key);
    req.AllowAutoRedirect = true;
    req.ContentType = "application/json";
    req.Accept = "application/json";
    req.Method = "GET";

    string jsonResponse = null;
    using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
    
        if (req.HaveResponse && resp != null)
        
            using (var reader = new StreamReader(resp.GetResponseStream()))
            
                jsonResponse = reader.ReadToEnd();
            
        
    

    return jsonResponse;

这是我用来从我的站点检索所有订单并将它们写入文件的循环:

public Order[] GetAllOrders()

    Order[] result = null;
    string orderString = "";

    try
    
        StringBuilder orders = new StringBuilder("[");
        String jsonResponse = BigCommerceGet("orders?limit=50&page=1");
        int page = 1;
        string prePend = "";

        while (jsonResponse != "")
        
            // Remove the leading and trailing brackets, and prepend a comma
            // beyond page 1.
            orders.Append(prePend + jsonResponse.Substring(1, jsonResponse.Length - 2));
            prePend = ",";
            page++;
            jsonResponse = BigCommerceGet("orders?limit=50&page=" + page.ToString());
        

        orders.Append("]");

        System.IO.FileStream wFile;
        byte[] byteData = null;
        byteData = Encoding.ASCII.GetBytes(orders.ToString());
        using (wFile = new FileStream(@"Z:\ThisIsYourFile.txt", FileMode.Create))
        
            wFile.Write(byteData, 0, byteData.Length);
            wFile.Close();
        

        orderString = orders.ToString();
        result = JsonConvert.DeserializeObject<Order[]>(orderString);
    
    catch (Exception e)
    
        Console.WriteLine("*** Exception encountered while retrieving store information: 0", e.ToString());
    

    return result;

您应该能够对其进行修改,以验证您是否可以始终如一地从您的网站检索订单。

【讨论】:

大约一周前开始偶尔发生,不,每次请求都会发生。来自 BC 的错误响应始终相同。我们没有任何改变,我们使用相同的代码一年或更长时间没有问题。似乎 BC 现在可能需要某种类型的安全连接? 感谢您提供额外的见解,但事实证明这是一个 TLS/SSL 协商问题。在下面的答案中注明的评论。【参考方案2】:

与 BC 对应后,似乎 BC API 服务器上禁用了 TLS 1.0,导致来自运行 IIS 的 Windows 2008 R2 Server 的请求出现问题。

SSL 3.0 之前已被 BC 禁用,它不会在 IIS 上为我抛出错误,因为我的服务器上也已禁用 SSL 3.0。

对于遇到类似问题的人,建议禁用 SSL 以及 TLS 1.0(TLS 1.0 协议将在不久的将来被 BC 弃用),只保留较新的协议。

来自 BC 的进一步说明:

*只是为了更新您 - 我们能够在 Windows Server 2008 机器上重现这些相同的问题。它看起来确实像 TLS/SSL 协商,特别是因为 2k8 仅支持 SSLv3(长时间禁用)和 TLS 1.0。我们禁用 TLS 1.0 [已删除] 作为我们迁移到新负载平衡器的一部分,我们的理解是我们应该担心 Windows Vista 及更低版本。不幸的是,2k8 共享相同的密码配置。

[已删除]

我将与我们的团队合作,在接下来的一个月左右大力弃用 TLSv1.0 和 API 流量的不安全密码。这只是我们今天流量的一小部分。我们会就此进行适当的沟通,但这会迫使您迁移到更新的操作系统。 *

【讨论】:

以上是关于BigCommerce API 连接问题/开始是间歇性的,现在更频繁的主要内容,如果未能解决你的问题,请参考以下文章

获取 BigCommerce 产品选项 variantId

从 Bigcommerce API 获取的简单反应应用程序

text 使用BigCommerce PHP API的应用程序

Bigcommerce 无头网站与 PayPal express 集成 [关闭]

付款方式 BigCommerce

如何在 Bigcommerce 商店中配置和上传 webhook?