2011-04-02 3 views
2

Je crée une application qui créera plusieurs objets HttpWebRequest et téléchargera mon code HTML via la méthode httpRequest.BeginGetResponse. Je récupère le IAsyncResult et le stocke localement afin que je puisse annuler la demande à tout moment, mais je ne suis pas sûr si je le fais correctement.Annulation de httpwebrequests asynchrones

Voici ce que je fais pour annuler la demande web async:

var res = (RequestState)asyncResult.AsyncState; 
res.Request.Abort(); 

Où demande est de type HttpWebRequest. Ce que je remarque est que même après avoir appelé ces lignes de code, tous les threads Async sont ouverts dans mon application. Et si j'ai défini un point d'arrêt dans le délégué appelé httpRequest.BeginGetResponse(GetResponseCallback, state) (par exemple, la méthode GetResponseCallback) Le débogueur interrompt la méthode après quelques secondes, entraînant le lancement d'une exception WebException lorsque cette méthode est exécutée.

Juste pour être complet, mon GetResponseCallback ressemble à ceci:

using (var httpWebResponse = (HttpWebResponse)request.EndGetResponse(result)) 
using (Stream dataStream = httpWebResponse.GetResponseStream()) 
using (var reader = new StreamReader(dataStream)) 
{ 
    string ret = reader.ReadToEnd(); 
    state.OnComplete(ret, new EventArgs()); 
} 

et je reçois le WebException sur la ligne using (Stream dataStream = httpWebResponse.GetResponseStream()). L'exception interne dit quelque chose comme "le serveur a activement refusé la connexion" ou quelque chose comme ça.

Toute aide serait excellente!

Répondre

4

De l'documentation for HttpWebRequest.Abort():

La méthode Abort annule une demande à une ressource. Une fois qu'une demande est annulée, l'appel de la méthode GetResponse, BeginGetResponse, EndGetResponse, GetRequestStream, BeginGetRequestStream ou EndGetRequestStream provoque une exception WebException avec la propriété Status définie sur RequestCanceled.

Ainsi, le comportement que vous décrivez est intentionnellement. Je pense que vous devrez attraper l'exception ou trouver un moyen de déterminer si Abort a été appelé avant d'appeler GetResponse, BeginGetResponse, EndGetResponse, GetRequestStream, BeginGetRequestStream ou EndGetRequestStream.