2010-10-27 26 views
4

Après un appel à initial HttpWebResponse.GetResponseStream() et en lisant le flux, ce flux est terminé et ne peut pas être réutilisé.Existe-t-il un moyen d'examiner WebResponse sans affecter le flux de réponses sous-jacent dans .NET?

J'ai une situation où j'ai besoin d'examiner le contenu de la réponse et si c'est d'une certaine donnée, obtenir une autre page, puis passer la nouvelle réponse sur la ligne. Sinon, transmettez la réponse d'origine telle quelle. Le seul problème est qu'après avoir examiné la réponse pour vérifier ces "données spéciales", cette réponse n'est pas bonne pour le code en aval. La seule façon, je pense, de rendre cela transparent au code en aval, est de créer une classe dérivée de HttpWebResponse, et de mettre en cache les données diffusées, et de passer ce flux caché sur la ligne au lieu de la courant. Je ne suis pas sûr que ce soit faisable puisque je ne l'ai pas examiné plus avant.

Existe-t-il d'autres moyens de gérer un scénario comme celui-ci?

Répondre

4

Que diriez-vous ceci:

using (var client = new WebClient()) 
{ 
    string result = client.DownloadString("http://www.foo.bar"); 
    // TODO: examine result as much as you wish 
} 

Si vous ne voulez pas charger la réponse tout en mémoire, vous pouvez passer à une fonction d'analyse qui l'examinera une fois et renvoyer un objet contenant toutes les propriétés que vous sont intéressés pour que vous puissiez examiner cet objet autant que vous le souhaitez.

+0

+1 pour avoir recommandé WebClient. Trop de gens utilisent WebRequest & WebResponse parce qu'ils ne connaissent pas WebClient, ce qui permet à la fois d'obtenir et de publier des requêtes dans une seule instruction. – Chris

+0

Je suis d'accord que les gens devraient utiliser WebClient plus. Mais dans mon cas, je ne peux pas utiliser WebClient car j'ai besoin de créer la requête moi-même. WebClient est bon pour les choses simples mais pas pour les demandes complexes. Et la demande étant complexe, il n'est pas seulement fastidieux de gérer cela du côté client, c'est-à-dire de recréer une autre requête. Ce que je veux, c'est être le plus transparent possible pour le code client. –

+0

Plus cette méthode ne vous obligerait pas à faire deux appels différents? Il pourrait être préférable de retourner la chaîne dans un flux après l'avoir vérifié. – BigOmega

2

Avez-vous essayé de définir le Position du flux de retour à ? Une fois que vous avez traité le flux, le curseur se trouve à la fin du flux.

C'est pourquoi lorsque ASP.NET commence à traiter le flux, il n'y a rien à lire. Essayez de déplacer le curseur au début du flux, puis ASP.NET peut lire la requête entière.

+0

Les flux retournés par WebRequest et WebResponse ne peuvent pas être recherchés - vous ne pouvez pas le rembobiner. C'était la première chose que j'ai essayée, croyez-moi. –

+0

@Jiho Han - Je pense que je l'ai fait avec HttpContext.Request. Désolé, cela n'a pas fonctionné ... –

1

On dirait que c'est peut-être le bon endroit pour un message inspector. Vous écraserez le AfterReceiveRequest pour rechercher vos "certaines données" pertinentes. Si aucune "certaines données" ne renvoient la copie dans le corps du message et disparaissent, sinon vous pourriez vouloir déclencher un événement ou lancer une exception que votre code attraperait puis "aller chercher cette autre page". Avec un inspecteur de messages, vous pouvez consulter les données entrantes/sortantes, les modifier si vous le souhaitez ou les transmettre à la destination d'origine sans les modifier.

Remarque: pour les inspecteurs de messages et les comportements personnalisés, vous devez disposer de .NET 3.0 ou version ultérieure.

+0

Ah ... on dirait que c'est une fonction WCF. Malheureusement, nous sommes toujours sur 2.0 ici. –