如何取消使用HttpWebResponse.GetResponseStream()获取的流的读取?

时间:2011-07-13 13:14:06

标签: windows-phone-7 httpwebresponse getresponsestream

我使用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。

谢谢! 米哈伊

2 个答案:

答案 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”通知完成执行。