C#WebRequest从有效URL返回间歇性500错误

时间:2017-01-05 10:48:50

标签: c# httpwebrequest webrequest

我有一个应用程序,用于从Web服务中读取和解析大量XML。它已经好几个月了。突然间,代码的一个特定部分在尝试从服务器获取响应时会抛出500个错误。

在调查中,在浏览器中点击其中一个有问题的URL会获得有效的响应和预期的XML。为了进一步增加这个谜团,本节迭代了许多改变URL中参数的请求,并且失败是间歇性的 - 不是一个特定的调用导致了这个问题。

我已尝试点击失败,通过浏览器请求,然后在调试模式下从代码继续处理url:这仍然导致500错误。

以下是代码 - 评论中有关于尝试修复的一些注意事项。基本上我已经看到了很多关于此的问题,建议的解决方法是添加用户代理。在这种情况下它没有起作用,以前的问题也没有间歇性的问题。

private static HttpWebResponse RetryGetResponse(WebRequest request)
{
    int failCounter = 1;

    while (failCounter < 20)
    {
        try
        {           
            // I tried this as a fix for the issue
            // the code functions but it didn't fix the bug
            // HttpWebRequest req = (HttpWebRequest)request;
            // req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36";
            // return (HttpWebResponse)req.GetResponse();

            // this is original code
            return (HttpWebResponse)request.GetResponse();
        }
        catch (WebException ex)
        {
            if (ex.Status != WebExceptionStatus.ReceiveFailure &&
                ex.Status != WebExceptionStatus.ConnectFailure &&
                ex.Status != WebExceptionStatus.KeepAliveFailure)
            {
                LogError(string.Format("Failed to contact server, retrying {0} times", failCounter), ex);
                Thread.Sleep(failCounter * 10000);
                failCounter++;
            }
        }
    }

    throw new Exception("Fatal error - unable to connect");
}

public static void PopulateActions()
{
    // this fetches data to iterate through
    DataTable customers = GetTableData("Customers");

    foreach (DataRow row in customers.Rows)
    {
        string url = string.Format(baseUrlTemplate, "subscribers", "actions.xml?email=" + HttpUtility.UrlEncode(row["EmailAddress"].ToString()));

        WebRequest request = WebRequest.Create(url);
        request.Timeout = 999999;
        request.Credentials = new NetworkCredential(networkKey, "");

        using (WebResponse response = RetryGetResponse(request))
        {
            XDocument doc = XDocument.Load(response.GetResponseStream());
            IEnumerable<XElement> emails = doc.Root.Elements("Email");

            foreach (XElement email in emails)
            {
                // parse the xml and record to Db
            }
        }
    }
}

我还可以做些什么来调查并尝试解决这个令人愤怒的间歇性问题?

编辑:回复详情

StatusCode: InternalServerError
StatusDescription: "Internal Server Error"

Headers:
{
Vary: Accept-Encoding
X-Cache: MISS
X-Code: 500
X-Error-Type: WS-Failure
X-Request-Duration: 30457ms
X-Request-Id: 979b6ee7-59c0-41e8-8acc-a38ec9b4087b
transfer-encoding: chunked
Connection: keep-alive
Cache-Control: private, s-maxage=0
Content-Type: application/xml
Date: Thu, 05 Jan 2017 11:02:32 GMT
P3P: CP="OTI DSP COR CUR IVD CONi OTPi OUR IND UNI STA PRE"
Server: cm-api-server
}

0 个答案:

没有答案