C# 有人知道我为什么收到HttpWebRequest超时吗?
我想知道你是否能帮我解决我的一个问题。我创建了一个HTTP管理器,可以帮助我处理从网站发布/获取数据。直到最近,当我尝试将两者混合使用时,它一直运行良好。第一个循环循环一切正常,第二个循环挂起HttpWebRequest.GetRequestStream()。我在网上读了很多书,没有找到真正的解决办法。以下是用于获取/接收的代码块:C# 有人知道我为什么收到HttpWebRequest超时吗?,c#,timeout,httprequest,freeze,C#,Timeout,Httprequest,Freeze,我想知道你是否能帮我解决我的一个问题。我创建了一个HTTP管理器,可以帮助我处理从网站发布/获取数据。直到最近,当我尝试将两者混合使用时,它一直运行良好。第一个循环循环一切正常,第二个循环挂起HttpWebRequest.GetRequestStream()。我在网上读了很多书,没有找到真正的解决办法。以下是用于获取/接收的代码块: ASCIIEncoding encoding = new ASCIIEncoding(); byte[] buffer = encoding.GetBytes(
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] buffer = encoding.GetBytes(_PostData);
_HttpWebRequest = (HttpWebRequest)WebRequest.Create(_FetchUrl);
_HttpWebRequest.Credentials = _Credentials;
_HttpWebRequest.Method = _RequestType.ToString();
_HttpWebRequest.ContentType = "application/x-www-form-urlencoded";
_HttpWebRequest.ContentLength = buffer.Length;
_HttpWebRequest.UserAgent = userAgent;
_HttpWebRequest.CookieContainer = _CookieContainer;
_HttpWebRequest.KeepAlive = false;
_HttpWebRequest.AllowAutoRedirect = _AllowAutoRedirect;
_HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip;
_HttpWebRequest.ServicePoint.Expect100Continue = false;
if (_RequestType.Equals(RequestTypes.POST))
{
// Write POST
Stream reqStream = _HttpWebRequest.GetRequestStream();
{
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Flush();
reqStream.Close();
}
}
以及回应:
HttpWebResponse httpWebResponse = (HttpWebResponse)_HttpWebRequest.GetResponse();
{
Stream responseStream = httpWebResponse.GetResponseStream();
{
if (_UseGzip)
{
if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip"))
{
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}
else
{
responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
}
}
if (responseStream != null)
{
StreamReader streamReader = new StreamReader(responseStream);
{
try
{
_PageContent = streamReader.ReadToEnd();
}
finally
{
streamReader.Close();
responseStream.Close();
httpWebResponse.Close();
}
}
}
else
{
_PageContent = string.Empty;
}
}
}
_HttpWebRequest.Abort();
有人能看出我的代码挂起的原因吗?所有流都已关闭,我已将允许的连接设置为100多个,我不明白为什么会断开连接。这可能是因为您没有处理WebResponse、流或流阅读器:
var request = WebRequest.Create(...);
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (var reader = new StreamReader(responseStream))
{
// use the reader
}
}
}
我也有同样的问题。我使用这些块正确地关闭(处理)了所有流和HttpWebResponse。当我垃圾邮件发送请求时,问题仍然存在,其中被ThreadAbortExceptions中止。最后,当ThreadAbortException发生时,它帮助调用myWebRequest.Abort()!希望这有帮助。我看到您使用:
HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip;
除手动减压方法外:
if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip"))
{
responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
}
else
{
responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
}
如果这真的很重要,我没有尝试,但我只使用手动方法和类似的代码,而且效果很好。事实上,我有一个悬而未决的问题,但只有一个域,对属性的实验显示了差异
哦,我怀疑如果你不使用任何后期数据压缩,你需要删除内容编码头你是否尝试过使用Wireshark之类的工具来查看实际发送的数据?当你说代码第一次工作但第二次停止时,在相应的请求期间,您使用了哪些http方法?代码挂在一个帖子上,GET似乎工作正常。当我通过burp代理运行代码时,出于某种原因,它工作正常吗?也许代理正在修复我的一些标题,因为我不明白这会有什么不同。试试John的回答,我遇到了与您类似的问题。处置资源解决了我的问题。我正在中止请求(没有可用的dispose方法),并关闭所有可用的流。我还尝试将所有对象设置为null,然后在每个请求结束时调用GC来处理它们,这也没有任何影响。@Paul:您还需要处理
StreamReader
,因为它实现了IDisposable
。与流相同,如果引发异常,则不会关闭该流。这就是使用
块为您所做的。无论发生什么情况,它都确保其参数已被释放。当我听说您的代码在随后的尝试中失败时,我想知道,“他在上一次尝试中没有做什么”。很多时候,答案是“有些东西没有处理掉”。