WebRequest多次写入和读取

时间:2017-05-01 03:10:29

标签: c# httpwebrequest

创建连接后,我需要发送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个线程上检查的。代码或服务器有什么问题不支持这个。

1 个答案:

答案 0 :(得分:0)

问题是您正在重新使用HWRequest。但是HttpWebRequest是一个单独使用的项目。换句话说,您只能触发一次请求。

因此,如果thr _RequiredIDs包含多个项目,则第一项将正常工作,但将HwRequest的状态更改为已完成(即现在包含响应)和{{1属性将设置为true。

如果您再次执行HaveResponseGetRequestStream(),则确定已经收到回复,再次设置请求没有意义。

因此您可以按如下方式修改代码:

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()