0

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

谢谢!
米海

4

2 回答 2

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

于 2011-07-13T17:37:59.107 回答
1

在我做了一些研究之后,我的结论是解锁的唯一解决方案streamReader.Read()是在取消方法中也包括对m_requestState.httpRequestStream.Close()(如最初问题中所述)的调用。这将使调用streamReader.Read()抛出 ObjectDisposedException 异常和“请求完成”通知以完成执行。

于 2011-07-15T06:22:48.893 回答