2010-10-24 5 views
3

Je développe un service Web asmx (à savoir ASP.NET 2.0).Première demande échoue avec HTTP 400 (demande incorrecte) après avoir lu HttpRequest.InputStream

Un morceau de code peut lire le contenu de la requête HTTP (via HttpContext.Current.Request.InputStream) lors du traitement. Je me rends compte que InputStream peut seulement être lu une fois pour une demande, et je m'assure que je n'essaie jamais de le lire plus d'une fois. Le problème semble être que si InputStream arrive à être lu pendant les premières étapes du cycle de vie de l'application (par exemple après pskill w3wp, pendant Application_Start), la requête HTTP échoue avec une erreur HTTP 400 - Bad Request, sans explication donnée , aucune exception levée et aucune entrée dans le journal httperr. S'il est lu plus tard (par exemple dans la méthode Web elle-même), les requêtes s'exécutent correctement si InputStream est lu ou non. Application_Start fonctionne correctement si InputStream n'est pas lu.

Est-ce une sorte de bogue ASP.NET? Bug IIS? Ou est-ce que je fais quelque chose de mal en osant lire InputStream? Et si oui, y a-t-il un autre moyen de voir le contenu "brut" de la requête sans déranger le fonctionnement interne de IIS/ASP.NET?

En bref, l'ajout de ce code dans Application_Start suffit de reproduire cette erreur:

using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream)) 
    reader.ReadToEnd(); 
+0

Je pense que vous devez poster un code qui reproduit cette question. N'envoyez pas tout votre code, juste assez pour que les gens courent et reprennent. – Kev

+0

Votre suggestion m'a forcé à enquêter un peu plus en profondeur. Question révisée en conséquence. Merci! –

+0

Je ne crois pas qu'il soit possible d'appeler reader.RadToEnd dans Application_Start car la requête n'a peut-être pas été entièrement reçue. –

Répondre

1

Impossible de trouver un moyen de lire le contenu de la requête au cours Application_Start sans perturber fonctionnement interne de ASP.NET/IIS. Au lieu de cela, fini par faire en sorte que cela ne se produise pas jusqu'à ce que Application_Start soit terminée (et ne se produise pas à partir du moment où Application_End commence, ce qui s'est avéré être problématique et a créé des violations d'accès).

1

Vous devez pas utiliser le bloc à l'aide parce que cela a pour effet de fermer le lecteur et par conséquent pour fermer la inputstream de HTTPRequest

0

Je suggère pas essayant de lire le Request.InputStream pendant Application_Start - il est utilisé pour initialiser l'application. L'accès à l'objet Request depuis Application_Start entraîne une exception "La requête n'est pas disponible dans ce contexte". Le fait que vous voulez lire le flux d'entrée suggère que vous devriez utiliser Application_BeginRequest à la place - cela a accès à la demande et la réponse.

En résumé:

  1. Application_Start
    feux une fois lorsque l'application démarre. Généralement déclenché par la première requête, il se produit avant que la première requête ne soit configurée. Ne faites pas de demande de code spécifique ici car il n'a pas accès à la demande et la réponse.

  2. Application_BeginRequest
    incendies pour chaque demande avant les gestionnaires de pages sont appelées - vous pouvez lire l'entrée, écrire à la réponse, mettre fin à la demande, etc ...

Voir ces SO articles pour plus d'informations:

Questions connexes