Comment puis-je voir la requête HTTP brute envoyée par la classe HttpWebRequest?

je sais que vous allez tous répondre "utilisez un serveur proxy de débogage comme Fiddler" mais ce n'est pas si simple.

voici ma situation: j'ai un code qui tourne sur un serveur, dans un ASP.NET page Code-behind (aspx.cs), qui (entre autres choses) établit une connexion à un autre serveur, saisit quelques trucs, puis le formate et le renvoie au navigateur.

le problème est que l'autre serveur fait le mauvais chose, et donc je veux être en mesure de passer un drapeau de débogage dans la page (via la chaîne de requête, par exemple ?debug=true) pour qu'il imprime la requête HTTP complètement crue qu'il envoie à l'autre serveur pour que je puisse voir ce qui ne va pas. Ce code est en cours d'exécution dans plusieurs endroits donc je veux être en mesure de passer dans ce drapeau sur le dev, la mise en scène, ou la production et juste voir la demande, sans avoir à comprendre si les serveurs de production peuvent parler à un proxy serveur qui existe quelque part, etc.

on pourrait penser qu'il serait facile de faire ça, hein? J'ai l'impression d'être folle, mais j'ai regardé la référence de HttpWebRequest et sa classe de parents WebRequest et ... rien. Pas faire. On aurait pu penser que Microsoft y aurait pensé. La chose la plus proche est que vous pouvez accéder à la collection "Headers" mais quand je l'ai essayé, il a omis certains headers vraiment importants comme "content length" -- donc il doit être " mensonge" pour moi (je sais que c'est mentir, parce que je sais pour un fait que le serveur distant retourne un statut 200 -- la requête est réussie, c'est juste retourner des données mauvaises/différentes/erronées)

Voici l'exemple de code demandé:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.whatever.com");
req.Method = ... whatever ...;
... other setup for the request ...
/* At this point we are about to send the request.
   What does the raw HTTP request look like? */
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
48
demandé sur eeeeaaii 2010-09-28 01:25:17

8 réponses

vous pouvez utiliser System.Net mécanisme de suivi pour voir les requêtes HTTP brutes envoyées sur le fil. Vous pouvez également ajouter votre propre tracelistener au processus.

13
répondu feroze 2012-08-16 01:50:36

je me rends compte que c'est une vieille question @feroze réponse dit de le faire, mais ne va pas dans les détails sur la façon de configurer System.Net traçage pour atteindre ce, Comme cette Question a été le premier résultat de google pour ma requête dans le sujet, comme nous sommes tous des gens occupés, je pensais que je vous sauver tous d'avoir à traquer ces informations.

Système

.web est très puissant pour déboguer HttpWebRequest et peut être facilement configuré en utilisant le web.config

<configuration>
    <system.diagnostics>

        <trace autoflush="true" /> 

        <sources>
            <source name="System.Net" maxdatasize="1024">
                <listeners>
                    <add name="MyTraceFile"/>
                    <add name="MyConsole"/>
                </listeners>
            </source>
        </sources>

        <sharedListeners>
            <add
              name="MyTraceFile"
              type="System.Diagnostics.TextWriterTraceListener"
              initializeData="System.Net.trace.log" />
                <add name="MyConsole" type="System.Diagnostics.ConsoleTraceListener" />
        </sharedListeners>

        <switches>
            <add name="System.Net" value="Verbose" />
        </switches>

    </system.diagnostics>
</configuration>

un simple HttpWebRequest dans votre code, et exécuté en mode débogage dans visual studio, les informations suivantes seront affichées dans la console de débogage.

System.Net Verbose: 0 : [6596] WebRequest::Create(https://example.com/service.asmx)
System.Net Verbose: 0 : [6596] HttpWebRequest#62063506::HttpWebRequest(https://example.com/service.asmx#11234)
System.Net Information: 0 : [6596] RAS supported: True
System.Net Verbose: 0 : [6596] Exiting HttpWebRequest#11234::HttpWebRequest() 
System.Net Verbose: 0 : [6596] Exiting WebRequest::Create()     -> HttpWebRequest#11234
System.Net Verbose: 0 : [6596] HttpWebRequest#11234 ::GetRequestStream()
System.Net Verbose: 0 : [6596] ServicePoint#11234 ::ServicePoint(example.com:443)
System.Net Information: 0 : [6596] Associating HttpWebRequest#11234with ServicePoint#11234
System.Net Information: 0 : [6596] Associating Connection#11234 with HttpWebRequest#11234 
System.Net Information: 0 : [6596] Connection#11234 - Created connection from x.x.x.x:xx to x.x.x.x:xx.
System.Net Information: 0 : [6596] TlsStream#11234 ::.ctor(host=example.com, #certs=0)
System.Net Information: 0 : [6596] Associating HttpWebRequest#11234 with ConnectStream#11234 
System.Net Verbose: 0 : [6596] Exiting HttpWebRequest#11234 ::GetRequestStream()    -> ConnectStream#11234 
System.Net Verbose: 0 : [6596] ConnectStream#7740977::Write()
System.Net Verbose: 0 : [6596] Data from ConnectStream#11234::Write
System.Net Verbose: 0 : [6596] 00000000 : 3C 73 6F 61 70 3A 45 6E-76 65 6C 6F 70 65 0D 0A : <soap:Envelope..
...etc

j'ai trouvé cela particulièrement utile en essayant de trouver la cause d'une erreur de client webservice, il s'est avéré que je manquais un en-tête.

102
répondu kamui 2016-09-03 13:04:02

vous pouvez utiliser un renifleur de trafic réseau comme wireshark .

ce n'est pas un proxy de débogage, mais va renifler tout trafic et vous permettre de voir les requêtes/réponses brutes.

5
répondu Oded 2010-09-27 21:29:22

répondant à ma propre question ici, parce que j'ai pensé à une autre façon de le faire. Fondamentalement, l'idée est -- vous redirigez le HttpWebRequest vers une page qui journalise la requête HTTP brute entrante. En d'autres termes, configurez un gestionnaire HTTP personnalisé selon le post de ce forum:

http://forums.asp.net/t/353955.aspx

et puis changer juste L'URL dans le HttpWebRequest pour pointer vers ce nouveau point final, mais garder tous les autres éléments de la demande la même chose. Ecrivez le résultat dans un fichier ou quelque chose et vous êtes en or.

4
répondu eeeeaaii 2010-10-06 15:05:20

autre suggestion. implémentez votre propre mandataire web , et définissez votre requête pour l'utiliser avec WebRequest.Proxy . Alors vous devriez être capable d'extraire le trafic de l'instance proxy.

Edit: mise à jour pour les liens.

1
répondu Mike Atlas 2017-05-23 11:54:50

vous dites que vous pensez que .NET vous ment, et l'exemple spécifique que vous donnez est que l'en-tête Content-Length est absent de la réponse HTTP.

mais l'en-tête Content-Length n'est pas requis d'une réponse HTTP. En fait, si le corps de la réponse est dans une dynamique quelconque, et si sa longueur n'est pas connue à l'avance, alors il est très probable que l'en-tête Content-Length sera omis!

0
répondu yfeldblum 2010-09-28 03:42:04

je vous suggère de télécharger Telerik Fiddler pour capturer le trafic entrant/sortant.

ici est un exemple simple comment le faire par cet outil:

  1. assurez-vous que le trafic de Capture est activé: enter image description here
  2. ouvrir le navigateur et rafraîchir la page, ou tout simplement envoyer la demande via le client HTTP. enter image description here
  3. après ce passage au violon, vous devriez voir votre demande: enter image description here
  4. en haut essayez de naviguer dans L'onglet" Raw". enter image description here
  5. dans la fenêtre ci-dessous est votre requête brute enter image description here
0
répondu Mroczny Arturek 2018-03-13 14:39:56

je dois manquer quelque chose, parce que l'obtention de la requête HTTP brute comme texte ASCII est vraiment facile, tant que vous l'attrapez dans le Page_Init() ce sera différent par Page_Load().

protected void Page_Init(object sender, EventArgs e)
{
    //this gets the raw request as an ASCII String.
    byte[] biData = Request.BinaryRead(Request.TotalBytes);
    string sWholeRequestAsString = System.Text.Encoding.ASCII.GetString(biData);

}
-1
répondu mike 2016-10-26 02:50:04