捕获HttpWebRequest超时

时间:2013-01-31 20:09:40

标签: c# httpwebrequest timeout webrequest httpwebresponse

public int loginEmail(string email, string password)
    {
        HttpWebRequest request = null;
        string responseStr = null;
        string Email = email;
        string Pass = password;

        UTF8Encoding encoding = new UTF8Encoding();
        string postData = "PostData";
        byte[] data = encoding.GetBytes(postData);

        request = (HttpWebRequest)WebRequest.Create("url");
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.AllowAutoRedirect = false;
        request.KeepAlive = false;
        request.Proxy = null;
        request.ServicePoint.ConnectionLimit = 1000;
        request.ContentLength = data.Length;
        request.Timeout = 5000;
        request.ServicePoint.ConnectionLeaseTimeout = 5000;
        request.ServicePoint.MaxIdleTime = 5000;

        using (Stream stream = request.GetRequestStream())
        {
            stream.Write(data, 0, data.Length);
        }

        try
        {
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                responseStr = response.Headers["Set-Cookie"];
            }
        }
        catch
        {
            return 1;
        }

        string[] cooktemp;
        string[] seperatortemp = new string[] { ";" };
        cooktemp = responseStr.Split(seperatortemp, StringSplitOptions.None);

        LoginHeaders[0] = cooktemp[0] + ";";

        return 0;
    }

此代码运行正常,但有时请求不会得到回复。当请求没有得到响应时,程序将挂起,然后最终会发出崩溃程序的超时错误。我现在要做的就是捕捉超时错误,以便我能够处理它,但似乎没有任何东西可以捕获它。

3 个答案:

答案 0 :(得分:4)

最有可能在GetRequestStream()超时。 documentation明确声明如果请求的超时期限过期,它可能会抛出WebException

因此,在try / catch中包含该代码块,您应该能够捕获它。

答案 1 :(得分:0)

这是一个老话题,但我今天也遇到了一个问题。

我没有意识到的是,如果您有一个Web服务,比如说,尝试写入已锁定的文件 ...那么将代码放在一个简单的{ {1}}还不够。

您必须专门拥有try..catch来处理catch

WebExceptions

我一直认为try { // Run your web service code } catch (WebException ex) { // Handle a WebException, such as trying to write to a "locked" file on the network } catch (Exception ex) { // Handle a regular Exception } WebException的一种类型,所以这些会被Exception处理程序捕获:

catch

它没有。

为避免您的代码丢失" 请求超时"消息,没有任何关于它们的原因的建议,请记得添加第二个catch (Exception ex) { // Handle a regular Exception } 处理程序。

顺便说一下,在我的web services tutorial上,这里是我推荐的代码,它会查找异常,并在Response标头中返回它们:

catch

答案 2 :(得分:-1)

System.Net.WebException

try { ... }            
catch (System.Net.WebException sne)
        {
            MessageBox.Show(req.Timeout.ToString());
        }

我认为无论如何,超时总是为“5000”。 如果你告诉它“超时是5秒”,那么在放弃之前总会尝试5秒。