C#HttpWebRequest在两次服务器错误后超时
在我发出两个因“(500)内部服务器错误500)而引发异常的C#HttpWebRequests之后,第三次尝试引发超时异常。为什么它不抛出另一个(500)内部服务器错误异常 当我重新启动应用程序时,它抛出两个500错误,然后再次开始超时 这是我的代码:C#HttpWebRequest在两次服务器错误后超时,c#,httpwebrequest,C#,Httpwebrequest,在我发出两个因“(500)内部服务器错误500)而引发异常的C#HttpWebRequests之后,第三次尝试引发超时异常。为什么它不抛出另一个(500)内部服务器错误异常 当我重新启动应用程序时,它抛出两个500错误,然后再次开始超时 这是我的代码: GetPages GetPages = new GetPages(); string test = GetPages.GetPage(); /* Exception: (500) Internal Server Error */ GetPages
GetPages GetPages = new GetPages();
string test = GetPages.GetPage(); /* Exception: (500) Internal Server Error */
GetPages.Dispose();
GetPages GetPages = new GetPages();
string test = GetPages.GetPage(); /* Exception: (500) Internal Server Error */
GetPages.Dispose();
GetPages GetPages = new GetPages();
string test = GetPages.GetPage(); /* Exception: time out, why? */
GetPages.Dispose();
namespace MyNamespace
{
class GetPages
{
public string GetPage()
{
this.httpRequest = (HttpWebRequest)WebRequest.Create("http://myurl");
try
{
StringBuilder postData = new StringBuilder(100);
postData.Append("test=test");
byte[] dataArray = Encoding.UTF8.GetBytes(postData.ToString());
httpRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
httpRequest.KeepAlive = false;
httpRequest.Proxy = null;
httpRequest.Method = "POST";
httpRequest.Timeout = 10;
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.ContentLength = dataArray.Length;
using (this.requestStream = httpRequest.GetRequestStream())
{
requestStream.Write(dataArray, 0, dataArray.Length);
requestStream.Flush();
requestStream.Close();
this.webResponse = (HttpWebResponse)httpRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();
StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
String responseString = responseReader.ReadToEnd();
MessageBox.Show(responseString);
return responseString;
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return "FAIL";
}
}
public void Dispose()
{
System.GC.SuppressFinalize(this);
}
}
}
这是GetPage类和GetPage方法:
GetPages GetPages = new GetPages();
string test = GetPages.GetPage(); /* Exception: (500) Internal Server Error */
GetPages.Dispose();
GetPages GetPages = new GetPages();
string test = GetPages.GetPage(); /* Exception: (500) Internal Server Error */
GetPages.Dispose();
GetPages GetPages = new GetPages();
string test = GetPages.GetPage(); /* Exception: time out, why? */
GetPages.Dispose();
namespace MyNamespace
{
class GetPages
{
public string GetPage()
{
this.httpRequest = (HttpWebRequest)WebRequest.Create("http://myurl");
try
{
StringBuilder postData = new StringBuilder(100);
postData.Append("test=test");
byte[] dataArray = Encoding.UTF8.GetBytes(postData.ToString());
httpRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
httpRequest.KeepAlive = false;
httpRequest.Proxy = null;
httpRequest.Method = "POST";
httpRequest.Timeout = 10;
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.ContentLength = dataArray.Length;
using (this.requestStream = httpRequest.GetRequestStream())
{
requestStream.Write(dataArray, 0, dataArray.Length);
requestStream.Flush();
requestStream.Close();
this.webResponse = (HttpWebResponse)httpRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();
StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
String responseString = responseReader.ReadToEnd();
MessageBox.Show(responseString);
return responseString;
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return "FAIL";
}
}
public void Dispose()
{
System.GC.SuppressFinalize(this);
}
}
}
更新
谢谢大家的帮助。我没能解决这个问题
dispose方法现在已不存在
我已将HttpWebRequest httpRequest、HttpWebResponse webResponse和Stream requestStream设置为本地,并使用以下using语句:
using (webResponse = (HttpWebResponse)httpRequest.GetResponse())
{
using (Stream responseStream = webResponse.GetResponseStream())
{
using (StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8))
{
responseString = responseReader.ReadToEnd();
}
}
}
另一次更新
这就是现在的整个GetPage方法:
public string GetPage()
{
HttpWebRequest httpRequest;
HttpWebResponse webResponse;
Stream requestStream;
try
{
StringBuilder postData = new StringBuilder(100);
postData.Append("test=test");
byte[] dataArray = Encoding.UTF8.GetBytes(postData.ToString());
httpRequest = (HttpWebRequest)WebRequest.Create("http://myurl");
httpRequest.Proxy = null;
httpRequest.Method = "POST";
httpRequest.Timeout = 10;
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.ContentLength = dataArray.Length;
using (requestStream = httpRequest.GetRequestStream())
{
/* this is never reached when the time out exception starts
so the error seems to be related to too many GetRequestStreams */
requestStream.Write(dataArray, 0, dataArray.Length);
webResponse = (HttpWebResponse)httpRequest.GetResponse();
/* this is never reached when the 500 server error occurs */
String responseString = "";
using (Stream responseStream = webResponse.GetResponseStream())
{
using (StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8))
{
responseString = responseReader.ReadToEnd();
return responseString;
}
}
}
}
catch (Exception e)
{
return "FAIL";
}
return "...";
}
**解决了**
httpRequest没有得到abort()'ed。在catch()块中,我添加了httpRequest.abort(),现在它工作正常。我怀疑这就是问题所在:
this.webResponse = (HttpWebResponse)httpRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();
StreamReader responseReader = new StreamReader(responseStream, Encoding.UTF8);
String responseString = responseReader.ReadToEnd();
你不能处理这些一次性物品。这意味着到web服务器的连接将一直保持到完成,因此连接池(每台服务器有两个连接)将不允许任何其他请求
我建议:
- 将
调用移出请求流的using语句GetResponse
- 您删除了对请求流的
和Flush
的显式调用(处理它就足够了)Close
- 您可以使用
和webResponse
局部变量而不是实例变量,除非以后确实需要它们,在这种情况下,您应该在webRequest
方法中处理它们dispose
- 对于
、WebResponse
和Stream
使用StreamReader
语句。(严格来说,最后一个并不是必需的,因为处理流已经足够好了。)
- 您使
无法实现GetPages
,除非您确实需要它IDisposable
responseStream
。该Dispose方法是我见过的最糟糕的方法。进行这些更改后,您看到了什么行为?完全一样?是的,完全一样。你不认为这是他的处置方法吗?:)@科恩:嗯。。。这让我感到惊讶。可能是因为抛出了异常,所以无法处理响应。您可能会捕获WebException并在其中处理响应。。。但是如果你真的要这么做,那就太可怕了:(@jon:你能看看整个方法吗?(我在第一篇文章中又添加了一个更新)@koen:我没发现你把keep alive关掉了。好奇者和好奇者。我恐怕现在没有时间去复制它:(@jon:我不得不使用catch块中的abort()方法手动中止httpRequest。非常感谢您的时间。我现在已经将responseStream包装在using语句中(请参阅第一篇文章中的更新).够了吗?是的,我想这就是连接松动而没有关闭的地方。奇怪的是,我把responseStream放到了using block,仍然超时。