GetResponse()和WebException杀死我的线程

时间:2017-07-16 13:32:50

标签: c# multithreading system.net.webexception getresponse

我实际上遇到了阻止我的线程的httpWebResponse问题。

我每2秒在一个循环线程中调用一个ApiCall方法。这大部分时间都有效。但有时request.GetResponse()会抛出WebException并停止我的主线程循环。它冻结应用程序而不会崩溃。它可以重试5次(MaxRetries)而不能正常工作。我不明白发生了什么。

这是ApiCall方法的代码部分。我真的不知道它的作用。所以在这里和那里选择了一些代码。我必须错过一些东西......但是什么?

public T CallWithJsonResponse<T>(string uri, bool hasEffects, params Tuple<string, string>[] headers)
    {
        if (simulate && hasEffects)
        {
            Debug.WriteLine("(simulated)" + GetCallDetails(uri));
            return default(T);
        }

        Debug.WriteLine(GetCallDetails(uri));
        var request = HttpWebRequest.CreateHttp(uri);
        foreach (var header in headers)
        {
            request.Headers.Add(header.Item1, header.Item2);
        }
        HttpWebResponse response = null;
        request.Timeout = 300000;

        for (int i = 0; i < MaxRetries; i++)
        {

            try
            {
                response = null;
                using (response = (HttpWebResponse)request.GetResponse())
                {
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        try
                        {
                            using (var sr = new StreamReader(response.GetResponseStream()))
                            {
                                var content = sr.ReadToEnd();
                                var jsonResponse = JsonConvert.DeserializeObject<ApiCallResponse<T>>(content);
                                sr.Close();
                                response.Close();

                                if (jsonResponse.success)
                                {
                                    //GC.Collect();
                                    GC.WaitForPendingFinalizers();
                                    return jsonResponse.result;
                                }
                                else
                                {

                                    Console.WriteLine(new Exception(jsonResponse.message.ToString()));

                                }
                            }
                        }
                        catch (Exception ex)
                        {

                            Console.WriteLine("Error - Call Details=" + GetCallDetails(uri) + "Exeption: " + ex.ToString());

                        }
                    }
                    else
                    {
                        Console.WriteLine("Error - StatusCode=" + response.StatusCode + " Call Details=" + GetCallDetails(uri));

                    }
                }
            }
            catch (WebException wex)
            {
                if (wex.Response != null)
                {
                    Console.WriteLine("ERROR (web exception, response generated): " + Environment.NewLine + new StreamReader(wex.Response.GetResponseStream()).ReadToEnd());
                }
                else
                {
                    Console.WriteLine("ERROR (web exception, NO RESPONSE): " + wex.Message + wex.StackTrace);
                }
                Console.WriteLine("Error - Call Details=" + GetCallDetails(uri));

            }
            catch (Exception ex)
            {
                Console.WriteLine("Error - Call Details=" + GetCallDetails(uri) + "Exception: " + ex.ToString());
            }
        }
        return default(T);
    }

private static string GetCallDetails(string uri)
    {
        StringBuilder sb = new StringBuilder();
        var u = new Uri(uri);
        sb.Append(u.AbsolutePath);
        if (u.Query.StartsWith("?"))
        {
            var queryParameters = u.Query.Substring(1).Split('&');
            foreach (var p in queryParameters)
            {
                if (!(p.ToLower().StartsWith("api") || p.ToLower().StartsWith("nonce")))
                {
                    var kv = p.Split('=');
                    if (kv.Length == 2)
                    {
                        if (sb.Length != 0)
                        {
                            sb.Append(", ");
                        }

                        sb.Append(kv[0]).Append(" = ").Append(kv[1]);
                    }
                }
            }
        }
        return sb.ToString();
    }

3 个答案:

答案 0 :(得分:0)

我建议改变:

catch (WebException wex)
{
    if (wex.Response != null)
    {
        Console.WriteLine("ERROR (web exception, response generated): " + Environment.NewLine + new StreamReader(wex.Response.GetResponseStream()).ReadToEnd());
    }
    else
    {
        Console.WriteLine("ERROR (web exception, NO RESPONSE): " + wex.Message + wex.StackTrace);
    }
    Console.WriteLine("Error - Call Details=" + GetCallDetails(uri));

}

为:

catch (WebException wex)
{
    try
    {
        if (wex.Response != null)
        {
            Console.WriteLine("ERROR (web exception, response generated): " + Environment.NewLine +
                              new StreamReader(wex.Response.GetResponseStream()).ReadToEnd());
        }
        else
        {
            Console.WriteLine("ERROR (web exception, NO RESPONSE): " + wex.Message + wex.StackTrace);
        }
        Console.WriteLine("Error - Call Details=" + GetCallDetails(uri));
    }
    catch (Exception bob)
    {
        // Ignore exceptions here
    }
}

然后在catch (Exception bob)行设置断点 - 以查看现有catch块失败的原因。

答案 1 :(得分:0)

好吧,它似乎运作正常,我试图像你说的Spender那样消耗每一个回复。 我还将try catch放在WebException catch中,就像你说mjwills但它从未捕获过。所以我认为消耗每一个响应都是我问题的解决方案。谢谢 !现在我需要在一周内监控应用程序,看看它是否健壮。

答案 2 :(得分:0)

没有...它没有改变任何东西。我创建了一些方法来检查WebException发生后线程是否仍然存在。你猜怎么着! try / catch正常工作,我收到了WebException。但过了一会儿,线程被停止或崩溃。不知道女巫一个是正确的...所以我实现了一个自动重启,如果线程被杀...这是非常丑陋,但它的工作原理。

此请求发生了什么.GetResponse()?即使捕获了异常,为什么它会杀死线程?这很奇怪......