我使用HttpWebResponse.BeginGetResponse()方法向我的服务器发出请求。在“请求完成”通知中,我执行以下操作(不包括错误处理代码):
HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(result);
BinaryReader streamReader = new BinaryReader(response.GetResponseStream());
while ((readSize = streamReader.Read(buffer, 0, buffer.Length)) > 0)
{
...
}
我的问题是,如果可以将从response.GetResponseStream()获取的Stream存储为某个成员变量,并按以下方式取消请求:
m_requestState.httpRequest.Abort();
m_requestState.httpRequestStream.Close(); // If this is missing then
// streamReader.Read() locks for a long time when connection is lost.
此代码导致streamReader.Read()抛出System.ObjectDisposedException。
谢谢! 米哈伊
答案 0 :(得分:1)
最好是存储webRequest并在try catch中取消它:
public void Cancel()
{
IsCancelled = true;
try
{
if (WebRequest != null)
{
WebRequest.Abort();
}
}
catch (Exception ex)
{
// slicence!
}
}
请在此处查看WebDownloader HelperClass:
http://www.manorey.net/mohblog/?p=17#content
在cancel()方法中设置了IsCancelled标志,以避免在调用Abort()之后调用OnComplete()。
答案 1 :(得分:1)
在我做了一些研究之后,我的结论是,解锁streamReader.Read()
的唯一解决方案是在取消方法中还包括对m_requestState.httpRequestStream.Close()
的调用(如初始问题中所述)。这将使调用streamReader.Read()
抛出ObjectDisposedException异常,并使“Request Complete”通知完成执行。