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();
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.
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.
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.
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.
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!
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:
- assurez-vous que le trafic de Capture est activé:
- ouvrir le navigateur et rafraîchir la page, ou tout simplement envoyer la demande via le client HTTP.
- après ce passage au violon, vous devriez voir votre demande:
- en haut essayez de naviguer dans L'onglet" Raw".
- dans la fenêtre ci-dessous est votre requête brute
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);
}