2010-10-13 4 views
6

J'utilise System.Net.WebClient pour effectuer des opérations HTTP en mode asynchrone. La raison d'utiliser des opérations asynchrones est, au-dessus de toute autre chose, le fait que je reçois des indications de changement de progression - qui est seulement disponible pour les opérations asynchrones, comme indiqué par the docs.Obtenir les en-têtes HTTP dans la requête WebClient asynchrone

Alors disons que je me WebClient mis en place:

this.client = new WebClient(); 
this.client.UploadStringCompleted += 
    new UploadStringCompletedEventHandler(textUploadComplete); 

et le délégué:

private void textUploadComplete(Object sender, UploadStringCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     // trigger UI failure notification 
     return; 
    } 

    // FIXME not checking for response code == 200 (OK) 
    // trigger UI success notification 
} 

Donc, vous voyez, je suppose que si aucune exception est soulevée, les demandes était toujours réussi (ce qui peut ne pas être le cas, puisque le code d'état de la réponse HTTP peut être! = 2xx). De la documentation sur UploadFileAsync je ne peux pas dire si une réponse non-200 est également traitée.

Je suis vraiment nouveau en C# et je n'arrive pas à trouver un moyen d'accéder aux en-têtes pour cette réponse de requête asynchrone particulière. Il me semble que chaque WebClient peut seulement contenir une réponse (ou un ensemble d'en-têtes) à un moment donné.

Bien que je ne sois pas en train d'exécuter plusieurs requêtes parallèles en même temps, j'aimerais quand même savoir s'il existe une façon plus élégante de récupérer les en-têtes de réponse/code d'état d'une requête plutôt que d'avoir à obtenir la "dernière réponse disponible" du WebClient.

Merci.

+0

Êtes-vous dans .NET 4.5? Si c'est le cas, essayez d'utiliser les surcharges de TaskAsync ... vous aurez toujours besoin d'accéder aux en-têtes de la classe WebClient, mais je ne trouverais pas cela inacceptable en utilisant le workflow TAP ... Je suis d'accord que ça fait un peu tort de le faire un gestionnaire d'événement ordinaire. 'await client.UploadStringTaskAsync (...); var headers = client.ResponseHeaders; ' – TCC

Répondre

0

Êtes-vous dans .NET 4.5? Si c'est le cas, essayez d'utiliser les surcharges de TaskAsync ... vous aurez toujours besoin d'accéder aux en-têtes de l'instance WebClient, mais je ne trouverais pas cela du tout inacceptable avec le flux de travail TAP ... Je suis d'accord un gestionnaire d'événement ordinaire.

await client.UploadStringTaskAsync(...); 
var headers = client.ResponseHeaders; 

Le meilleur de tout ce que vous pouvez faire tout cela sur le thread d'interface utilisateur ... ne bloque pas ... si votre « interface de mise à jour de déclenchement » est vraiment « interface utilisateur mise à jour ».

Questions connexes