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

时间:2017-03-01 20:13:02

标签: c# .net bigcommerce

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

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

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

  

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

     

InnerException: System.IO.IOException:身份验证失败,因为远程方已关闭传输流。在   System.Net.Security.SslState.StartReadFrame(Byte []缓冲区,Int32   readBytes,AsyncProtocolRequest asyncRequest)at   System.Net.Security.SslState.StartReceiveBlob(Byte []缓冲区,   AsyncProtocolRequest asyncRequest)at   System.Net.Security.SslState.StartSendBlob(Byte [] incoming,Int32   count,AsyncProtocolRequest asyncRequest)at   System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst,   Byte [] buffer,AsyncProtocolRequest asyncRequest)at   System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult   lazyResult)at   System.Threading.ExecutionContext.RunInternal(执行上下文   executionContext,ContextCallback回调,对象状态,布尔值   preserveSyncCtx)at   System.Threading.ExecutionContext.Run(执行上下文   executionContext,ContextCallback回调,对象状态,布尔值   preserveSyncCtx)at   System.Threading.ExecutionContext.Run(执行上下文   executionContext,ContextCallback回调,对象状态)at   System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)at   System.Net.TlsStream.Write(Byte []缓冲区,Int32偏移量,Int32大小)at   System.Net.ConnectStream.WriteHeaders(Boolean async)

    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();
                }
            }
        }
    }

2 个答案:

答案 0 :(得分: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;
}

您应该可以对此进行修改,以验证您是否可以始终从您的网站检索订单。

答案 1 :(得分:1)

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

以前,BC 3.0已禁用SSL 3.0,因为我的服务器上也没有禁用SSL 3.0,因此我没有在IIS上抛出错误。

对于遇到类似问题的人,建议禁用SSL以及TLS 1.0(不久的将来BC将不推荐使用TLS 1.0协议),只留下更新的协议。

BC的进一步说明:

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

[移除]

我将与我们的团队合作,在接下来的一个月左右积极地弃用TLSv1.0和不安全的API流量密码。今天我们的流量非常少。我们将围绕此进行适当的沟通,但它会迫使您迁移到更新的操作系统。 *