创建连接后,我需要发送ID然后存储响应,然后一次又一次地发送(通常是~60-100个ID)。目前我这样做了:
public void EThread()
{
HttpWebRequest HWRequest = (HttpWebRequest)WebRequest.Create(_AjaxURL);
HWRequest.Method = "POST";
HWRequest.ContentType = "text/xml; encoding='utf-8'";
string StrID;
while(!_RequiredIDs.IsEmpty)
if (_RequiredIDs.TryDequeue(out StrID))
Extract(StrID, ref HWRequest);
}
public void Extract(string ID, ref HttpWebRequest HWRequest)
{
string data = "strID=" + ID;
byte[] Bytes = Encoding.ASCII.GetBytes(data);
using (Stream SWriter = HWRequest.GetRequestStream())
{
SWriter.Write(Bytes, 0, Bytes.Length);
SWriter.Close();
}
HttpWebResponse resp = (HttpWebResponse)HWRequest.GetResponse();
using (Stream s = resp.GetResponseStream())
using (StreamReader sr = new StreamReader(s))
_RespnseCollection.Enqueue(sr.ReadToEnd());
}
但是,我收到了这个错误:System.Net.WebException: 'The request was aborted: The connection was closed unexpectedly.
。如果我将HttpWebRequest放在Extract
方法中,它可以正常工作,但这很长。这是在1个线程上检查的。代码或服务器有什么问题不支持这个。
答案 0 :(得分:0)
问题是您正在重新使用HWRequest。但是HttpWebRequest
是一个单独使用的项目。换句话说,您只能触发一次请求。
因此,如果thr _RequiredIDs
包含多个项目,则第一项将正常工作,但将HwRequest
的状态更改为已完成(即现在包含响应)和{{1属性将设置为true。
如果您再次执行HaveResponse
或GetRequestStream()
,则确定已经收到回复,再次设置请求没有意义。
因此您可以按如下方式修改代码:
GetResponse()
但是,我认为这在功能上等同于声明public void EThread()
{
string StrID;
while(!_RequiredIDs.IsEmpty)
if (_RequiredIDs.TryDequeue(out StrID))
{
HttpWebRequest HWRequest = (HttpWebRequest)WebRequest.Create(_AjaxURL);
HWRequest.Method = "POST";
HWRequest.ContentType = "text/xml; encoding='utf-8'";
Extract(StrID, ref HWRequest);
}
}
并在HttpRequest
方法内初始化。
SUGGESTIION:
尝试拨打Extract
:
HWRequest.Reset()