request.GetResponse总是给人超时 [英] request.GetResponse gives always a Timeout
问题描述
我做了一个功能的程序,它不工作时,请求类型是 GET
,如果是 POST
,它总是产生超时异常(和50年代的超时wasnt到达)的行 HttpWebResponse响应=(HttpWebResponse)request.GetResponse();
我试过很多东西,但我犯规找到了原因,也许这里有人知道这一点。
修改:得到它的工作,如果有人有兴趣: https://gist.github.com/4347248
任何帮助将大大AP preciated。
我的code是:
公共ResRequest请求(字符串URL,请求类型(典型值),CookieCollection饼干,串POSTDATA =,INT超时= 50000)
{
byte []的数据;
流REQ;
流RESP;
HttpWebRequest的要求= WebRequest.Create(URL)为HttpWebRequest的;
request.Timeout =超时;
request.ContinueTimeout =超时;
request.ReadWriteTimeout =超时;
request.Proxy =新WebProxy(127.0.0.1,8118);
request.Headers.Add(Htt的prequestHeader.AcceptLanguage,德);
request.Headers.Add(UA-CPU,86);
request.Headers.Add(Htt的prequestHeader.AcceptEncoding,GZIP,放气);
request.UserAgent =Mozilla的/ 4.0(兼容; 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 =新的CookieContainer();
request.CookieContainer.Add(饼干);
如果(典型值== RequestType.POST)
{
数据= System.Text.Encoding.Default.GetBytes(POSTDATA);
request.Method =POST;
request.ContentType =应用/的X WWW的形式urlen codeD;
request.ContentLength = data.Length;
REQ = request.GetRequestStream(); //试了几次后,这产生了超时错误
req.Write(数据,0,data.Length);
req.Close();
HttpWebResponse响应=(HttpWebResponse)request.GetResponse(); //这一行产生超时异常
RESP = response.GetResponseStream();
如果((response.ContentEncoding.ToLower()。包含(GZIP)))
{
RESP =新System.IO.Com pression.GZipStream(RESP,System.IO.Com pression.Com pressionMode.Decom preSS);
}否则,如果((response.ContentEncoding.ToLower()。包含(放气))){
RESP =新System.IO.Com pression.DeflateStream(RESP,System.IO.Com pression.Com pressionMode.Decom preSS);
}
返回新ResRequest(){结果=新就是System.IO.StreamReader(RESP,System.Text.Encoding.UTF8).ReadToEnd(),饼干= response.Cookies,CString的= cookiestring(response.Cookies)};
}
其他
{
request.Method =GET;
HttpWebResponse响应=(HttpWebResponse)request.GetResponse();
RESP = response.GetResponseStream();
如果((response.ContentEncoding.ToLower()。包含(GZIP)))
{
RESP =新System.IO.Com pression.GZipStream(RESP,System.IO.Com pression.Com pressionMode.Decom preSS);
}
否则,如果((response.ContentEncoding.ToLower()。包含(放气)))
{
RESP =新System.IO.Com pression.DeflateStream(RESP,System.IO.Com pression.Com pressionMode.Decom preSS);
}
返回新ResRequest(){结果=新就是System.IO.StreamReader(RESP,System.Text.Encoding.UTF8).ReadToEnd(),饼干= response.Cookies,CString的= cookiestring(response.Cookies)};
}
}
所以它每次都挂在 req.GetRequestStream()
,或它的工作原理几试图然后挂机?
如果它工作了几下,然后挂起,它可能是你没有关闭请求不当,这是造成你用完的连接。确保关闭()
和/或的Dispose()
的 HttpWebResponse
的对象,所有的流和读者,你创造的。
I made a Function for a program, which does work when the Request Type is GET
, if it is POST
, it always produces a Timeout Exception(and the timeout of 50s wasnt reached) on the Line HttpWebResponse response = (HttpWebResponse)request.GetResponse();
I tried many things, but I doesnt found out why, may someone here know it.
Edit: Got it to work, if someone is interested: https://gist.github.com/4347248
Any help will be greatly appreciated.
My Code is:
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) };
}
}
So does it hang on req.GetRequestStream()
every time, or does it work "a few tries" and then hang?
If it works a few times and then hangs, it's possible that you're not closing the requests properly, which is causing you to run out of connections. Make sure to Close()
and/or Dispose()
the HttpWebResponse
objects and all of the Streams and Readers that you're creating.
这篇关于request.GetResponse总是给人超时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!