简体   繁体   中英

How to cancel reading from a Stream obtained using HttpWebResponse.GetResponseStream()?

I use HttpWebResponse.BeginGetResponse() method to make a request to my server. In the "Request Complete" notification I do the following (no error handling code included):

HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(result);
BinaryReader streamReader = new BinaryReader(response.GetResponseStream());

while ((readSize = streamReader.Read(buffer, 0, buffer.Length)) > 0)
{
...
}

My question is if it is OK to store the Stream obtained from response.GetResponseStream() somewhere as a member variable and make the Cancel of the request like this:

m_requestState.httpRequest.Abort();
m_requestState.httpRequestStream.Close(); // If this is missing then
// streamReader.Read() locks for a long time when connection is lost.

This code causes the streamReader.Read() to throw System.ObjectDisposedException.

Thank you!
Mihai

it's best if you store your webRequest instead and cancel it in a try catch:

    public void Cancel()
    {
        IsCancelled = true; 

        try
        {
            if (WebRequest != null)
            {
                WebRequest.Abort();
            }
        }
        catch (Exception ex)
        {
            // slicence!
        }
    } 

See WebDownloader HelperClass here:

http://www.manorey.net/mohblog/?p=17#content

IsCancelled flag is set in the cancel() method to avoid calling OnComplete() even after the Abort() is called.

After I did some research, my conclusion is that the only solution to unlock streamReader.Read() is to include in the canceling method also the call to m_requestState.httpRequestStream.Close() (as stated in the initial question). This will make the call streamReader.Read() to throw ObjectDisposedException exception and the "Request Complete" notification to finish execution.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM