最近在做并发测试,用到了多线程去请求server,发现请求的数据太大时会有不少线程抛出操作超时的异常。通过增加一bool变量判断是否超时,如果超时则继续等待,否则返回结果。代码如下,超时的问题暂时解决,但没有分析这样是否足够合理,目前还在测试中...
wenanry说可以加上如下一段代码,感觉和我下面写的效果应该是一样的。
//这个在Post的时候,一定要加上,如果服务器返回错误,他还会继续再去请求,不会使用之前的错误数据,做返回数据
HttpWebRequest .ServicePoint.Expect100Continue = false;
private long RequestMethod(string strParameters)
{
long nRet = 0;
bool bTimeOut = true;
while (bTimeOut)
{
try
{
System.Text.Encoding GB2312 = System.Text.Encoding.GetEncoding("GB2312");
byte[] szByte = GB2312.GetBytes(strParameters);
string strUri = @"http://192.168.1.1/XXX.Interface/InterfaceProvider.ashx";
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(strUri);
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.ContentLength = szByte.Length;
httpWebRequest.Method = "POST";
using (Stream reqStream = httpWebRequest.GetRequestStream())
{
reqStream.Write(szByte, 0, szByte.Length);
}
using (WebResponse wr = httpWebRequest.GetResponse())
{
//在这里对接收到的页面内容进行处理
Stream responseStream = wr.GetResponseStream();
StreamReader responseReader = new StreamReader(responseStream);
string strRet = responseReader.ReadToEnd();
nRet = wr.ContentLength;
}
bTimeOut = false;
}
catch (WebException ex)
{
HttpStatusCode status = ((HttpWebResponse)ex.Response).StatusCode;
if (status == HttpStatusCode.RequestTimeout)
{
Thread.Sleeps(1000);
}
}
}
return nRet;
}