Http请求超时问题
我使用VSTS 2008 + C#+ .Net 3.5开发控制台应用程序,并向另一台服务器(Windows Server 2008上的IIS 7.0)发送请求。这是我的代码。我的问题是,就像在我的代码中一样,我使用while循环来从服务器读取块。 Timeout = Timeout * 1000负责(1)打开连接到服务器的超时时间,或者(2)每次读取操作的超时时间,或者(3)while循环的总时间?Http请求超时问题
static void PerformanceWorker()
{
Stream dataStream = null;
HttpWebRequest request = null;
HttpWebResponse response = null;
StreamReader reader = null;
try
{
request = (HttpWebRequest)WebRequest.Create(TargetURL);
request.Timeout = Timeout * 1000;
request.Proxy = null;
response = (HttpWebResponse)request.GetResponse();
dataStream = response.GetResponseStream();
reader = new StreamReader(dataStream);
// 1 M at one time
char[] c = new char[1000 * 10];
while (reader.Read(c, 0, c.Length) > 0)
{
globalCounter++;
}
}
catch (Exception ex)
{
lock (counterLock)
{
globalFailCounter++;
Console.WriteLine("Fail Counter: " + globalFailCounter + "\n" + ex.Message + "\n" + ex.StackTrace);
}
}
finally
{
if (null != reader)
{
reader.Close();
}
if (null != dataStream)
{
dataStream.Close();
}
if (null != response)
{
response.Close();
}
}
}
如从MSDN:
超时是后续同步请求 与GetResponse的方法等待由毫秒 的数 作为响应,并且 GetRequestStream方法等待 流。如果在超时期限内返回的资源不是 ,则 请求将抛出一个WebException,其中 的Status属性设置为 WebExceptionStatus.Timeout。
我不确定您是否可以轻松设置超时读取操作,而不需要任何低级技巧。您使用响应对象读取的所有数据都来自网卡缓冲区,该缓冲区以您的可用网络带宽速率填充。当缓冲区为空并且没有新的数据来自发送方端点时,您将在执行读取时的某个时间点超时。
P.S.这更多的是对@Gary回答的评论,也许有人可以将它移到那里。
你的意思是HttpWebRequest.Timeout只用于打开连接? – George2 2009-10-20 16:20:56
我在这里有一个相关的问题,如果你可以看看,很感激。 http://*.com/questions/1598748/unable-to-connect-to-remote-server-fail-in-httpwebrequest – George2 2009-10-21 04:57:20
Well Timeout用于打开连接和所有下面的同步请求。所以调用GetResponse()将超时。我怀疑GetResponse()完成后,您已经拥有了网络(卡)缓冲区中的所有必需数据。当您执行Read()操作时,实际上并不是从网络中检索位,而是缓冲区本身,因此在此阶段超时并不重要。 请注意,我不是100%确定这个s很简单,如果你的响应数据大小大于网络缓冲区,可能在你读通话的某个阶段会阻塞,直到缓冲区再次充满数据。 – Audrius 2009-10-21 08:40:44
谢谢,我从现在开始照顾它。 :-) – George2 2009-10-21 04:56:11