2012-12-19 107 views
12

我为程序做了一个函数,当请求类型为GET时,如果它是POST,它会工作,它总是会产生一个超时异常(并且超时时间不会达到50s)行HttpWebResponse response = (HttpWebResponse)request.GetResponse();
我尝试了很多事情,但我不知道为什么,可能有人在这里知道。

编辑:得到它的工作,如果有人有兴趣:https://gist.github.com/4347248

任何帮助将不胜感激。

我的代码是:request.GetResponse总是给出一个超时

public ResRequest request(string URL, RequestType typ, CookieCollection cookies, string postdata ="", int timeout= 50000) 
    { 
     byte[] data; 
     Stream req; 
     Stream resp; 

     HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest; 
     request.Timeout = timeout; 
     request.ContinueTimeout = timeout; 
     request.ReadWriteTimeout = timeout; 
     request.Proxy = new WebProxy("127.0.0.1", 8118); 
     request.Headers.Add(HttpRequestHeader.AcceptLanguage, "de"); 
     request.Headers.Add("UA-CPU", "x86"); 


     request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); 
     request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618) "; 
     request.CookieContainer = new CookieContainer(); 
     request.CookieContainer.Add(cookies); 
     if (typ == RequestType.POST) 
     { 
      data = System.Text.Encoding.Default.GetBytes(postdata); 
      request.Method = "POST"; 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.ContentLength = data.Length; 
      req = request.GetRequestStream();//after a few tries this produced a Timeout error 
      req.Write(data, 0, data.Length); 
      req.Close(); 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse();//This line produces a Timeout Exception 
      resp = response.GetResponseStream(); 

      if ((response.ContentEncoding.ToLower().Contains("gzip"))) 
      { 
       resp = new System.IO.Compression.GZipStream(resp, System.IO.Compression.CompressionMode.Decompress); 
      } else if ((response.ContentEncoding.ToLower().Contains("deflate"))) { 
       resp = new System.IO.Compression.DeflateStream(resp, System.IO.Compression.CompressionMode.Decompress); 
      } 

      return new ResRequest() { result = new System.IO.StreamReader(resp, System.Text.Encoding.UTF8).ReadToEnd(), cookies = response.Cookies, cstring = cookiestring(response.Cookies) }; 

     } 
     else 
     { 
      request.Method = "GET"; 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      resp = response.GetResponseStream(); 

      if ((response.ContentEncoding.ToLower().Contains("gzip"))) 
      { 
       resp = new System.IO.Compression.GZipStream(resp, System.IO.Compression.CompressionMode.Decompress); 
      } 
      else if ((response.ContentEncoding.ToLower().Contains("deflate"))) 
      { 
       resp = new System.IO.Compression.DeflateStream(resp, System.IO.Compression.CompressionMode.Decompress); 
      } 

      return new ResRequest() { result = new System.IO.StreamReader(resp, System.Text.Encoding.UTF8).ReadToEnd(), cookies = response.Cookies, cstring = cookiestring(response.Cookies) }; 
     } 

    } 
+0

“LITTLE”函数??? –

+0

确定它不少...我删除了它 – Tearsdontfalls

+0

你为“超时”设置了什么? – VladL

回答

16

所以它在req.GetRequestStream()每次挂,或者它的工作原理“试了几次”,然后挂?

如果它工作了几次然后挂起,可能是因为没有正确关闭请求,这会导致连接用完。请确保Close()和/或Dispose()HttpWebResponse对象以及您正在创建的所有流和读者。

+0

每当我做一个'req.GetRequestStream()'时它就会挂起。谢谢,但它没有工作。我还发现,当我没有传递任何Post参数到请求它将连接并返回500服务器错误 – Tearsdontfalls

+0

什么是'data.Length'?你想发送一些非常大的东西吗? –

+1

根据几个示例代码重写了函数之后,第三个请求之后的每个请求均失败。感谢您的提示,我在'HttpWebRespose'和'Stream'中添加了'Close();'和'Dispose();'现在一切都很好。代码:https://gist.github.com/4347248 – Tearsdontfalls

1

您必须使用 response.Dispose();

方法结束