在我创建两个因“(500) 内部服务器错误 500”而抛出异常的 C# HttpWebRequest 之后,第三次尝试抛出超时异常。为什么它不抛出另一个 (500) Internal Server Error 异常?
当我重新启动我的应用程序时,它会抛出两个 500 错误,然后再次开始超时。
这是我的代码:
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();
这是 GetPages 类和 GetPage 方法:
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 没有被中止()。在 catch() block 中,我添加了 httpRequest.abort(),现在它可以正常工作了。
最佳答案
我怀疑这是问题所在:
this.webResponse = (HttpWebResponse)httpRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();
StreamReader responseReader = new StreamReader(responseStream, Encoding.UTF8);
String responseString = responseReader.ReadToEnd();
您不会处理任何这些一次性元素。这意味着与 Web 服务器的连接将一直保持到最终确定,因此连接池(每个服务器两个连接)将不允许任何其他请求。
我建议:
- 您将
GetResponse
调用从请求流的 using 语句中移出 - 您删除了对请求流的
Flush
和Close
的显式调用(处理它就足够了) - 您制作
webResponse
和webRequest
局部变量而不是实例变量,除非您以后真的需要它们,在这种情况下您应该处理它们在您的Dispose
方法中。 - 您对
WebResponse
、Stream
和StreamReader
使用using
语句。 (最后一个不是绝对必要的,因为处理流就足够了。) - 你让
GetPages
不实现IDisposable
,除非你真的需要它。
关于C# HttpWebRequest 在两次服务器 500 错误后超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4033159/