C# request.GetResponse始终提供超时
我为一个程序创建了一个函数,当请求类型为C# request.GetResponse始终提供超时,c#,.net,httpwebrequest,timeout,C#,.net,Httpwebrequest,Timeout,我为一个程序创建了一个函数,当请求类型为GET时,该函数可以工作,如果它是POST,它总是在HttpWebResponse=(HttpWebResponse)Request.GetResponse()行上产生超时异常(并且没有达到50秒的超时) 我尝试了很多东西,但我不知道为什么,也许这里有人知道。 编辑:如果有人感兴趣,就让它工作起来: 任何帮助都将不胜感激。 我的代码是: public ResRequest request(string URL, RequestType typ, Co
GET
时,该函数可以工作,如果它是POST
,它总是在HttpWebResponse=(HttpWebResponse)Request.GetResponse()行上产生超时异常(并且没有达到50秒的超时)代码>
我尝试了很多东西,但我不知道为什么,也许这里有人知道。
编辑:如果有人感兴趣,就让它工作起来:
任何帮助都将不胜感激。
我的代码是:
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) };
}
}
那么它是每次挂起req.GetRequestStream()
,还是“几次尝试”后挂起
如果它工作了几次,然后挂起,则可能是您没有正确关闭请求,这导致连接耗尽。确保Close()
和/或Dispose()
HttpWebResponse
对象以及您正在创建的所有流和读卡器。您必须使用
response.Dispose()
方法的结尾好的,它不小。。。我删除了它,你为'timeout'设置了什么?我没有设置可选参数,因此它的50000/50s可能是一个多部分的帖子。不确定问题是什么,但尝试这个家伙的方法来写帖子数据,看看是否有效。每次我执行
req.GetRequestStream()
时,它都会挂起。谢谢,但没用。我还发现,当我不向请求传递任何Post参数时,它将连接并返回一个500服务器错误。什么是data.Length
?你想发送一些非常大的东西吗?在我根据几个示例代码重写函数之后,第三个请求之后的每个请求都失败了。多亏了你的提示,我添加了Close()代码>和Dispose()
到HttpWebRespose
和流
s,现在一切都很好。代码: