Come vedo la richiesta HTTP non elaborata inviata dalla class HttpWebRequest?

So che tutti risponderanno “usa un server proxy di debug come Fiddler” ma non è così semplice.

Ecco la mia situazione: ho del codice che gira su un server, in una pagina ASP.NET code-behind (aspx.cs), che (tra le altre cose) stabilisce una connessione con un altro server, afferra alcune cose, e poi la formatta e lo restituisce al browser.

Il problema è che l’altro server sta facendo la cosa sbagliata, e quindi voglio essere in grado di passare un flag di debug nella pagina (tramite la stringa di query, ad esempio? Debug = true) in modo che stampi il HTTP completamente grezzo richiesta che invii all’altro server in modo da poter vedere cosa diavolo è sbagliato. Questo codice è in esecuzione in diversi punti, quindi voglio essere in grado di passare questo flag su dev, staging o produzione e solo vedere la richiesta, senza dover capire se i server di produzione possono parlare con qualche server proxy che esiste da qualche parte , eccetera.

Penseresti che sarebbe facile farlo, giusto? Quindi mi sento come se fossi pazzo o qualcosa del genere, ma ho guardato il riferimento per HttpWebRequest e la sua class madre WebRequest e – niente. Non si puo ‘fare. Penseresti che Microsoft avrebbe pensato a questo. La cosa più vicina è che puoi accedere alla raccolta “Intestazioni” ma quando l’ho provato, ha omesso alcune intestazioni molto importanti come “lunghezza del contenuto” – quindi deve essere “mentire” a me (so che sta mentendo, perché so per il fatto che il server remoto sta restituendo uno stato 200 – la richiesta ha successo, sta solo restituendo dati errati / diversi / errati)

Ecco l’esempio di codice richiesto:

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(); 

È ansible utilizzare il meccanismo di tracciamento System.Net per visualizzare le richieste HTTP non elaborate inviate sul filo. Puoi anche aggiungere il tuo tracelistener al processo.

Mi rendo conto che questa è una vecchia domanda @feroze answer dice di fare questo, ma non entra nei dettagli su come impostare la traccia System.Net per raggiungere questo objective, poiché questa domanda è stata il primo risultato di google per la mia ricerca nell’argomento, come siamo tutti persone impegnate Ho pensato di salvarti tutti dal dover dare la caccia a queste informazioni.

System.web è molto potente per il debug di HttpWebRequest e può essere facilmente configurato usando web.config

                     

Un semplice HttpWebRequest nel tuo codice, e in esecuzione in modalità di debug in Visual Studio, le seguenti informazioni verranno visualizzate nella console di debug.

 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 xxxx:xx to xxxx: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 :  

Ho trovato questo particolarmente utile quando si cerca di scoprire la causa di un errore del client webservice, si è scoperto che mi mancava un'intestazione.

È ansible utilizzare uno sniffer del traffico di rete come wireshark .

Questo non è un proxy di debug, ma annuserà tutto il traffico e ti permetterà di vedere le richieste / risposte non elaborate.

rispondendo alla mia domanda qui, perché ho pensato ad un altro modo per farlo. Fondamentalmente l’idea è: si richiama HttpWebRequest su una pagina che registra la richiesta HTTP raw in entrata. In altre parole, imposta un gestore HTTP personalizzato come da questo post sul forum:

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

E quindi modificare solo l’URL in HttpWebRequest per puntare a questo nuovo endpoint, ma mantenere tutti gli altri elementi della richiesta lo stesso. Scrivi il risultato in un file o qualcosa e sei d’oro.

Un altro suggerimento Implementa il tuo proxy web e imposta la tua richiesta per usarlo con WebRequest.Proxy . Quindi dovresti essere in grado di estrarre il traffico dall’istanza proxy.

Modifica: aggiornamento per i collegamenti.

Tu dici che pensi che .NET ti stia mentendo, e l’esempio specifico che hai dato è che l’intestazione Content-Length manca nella risposta HTTP.

Ma l’intestazione Content-Length non è richiesta da una risposta HTTP. Infatti, se il corpo della risposta è dinamico, e se la sua lunghezza non è nota in anticipo, è molto probabile che l’intestazione Content-Length venga omessa!

Ti suggerisco di scaricare Telerik Fiddler per catturare il traffico in entrata / in uscita.

Qui c’è un semplice esempio su come farlo con questo strumento:

  1. Assicurati che il Capture Traffic sia abilitato: inserisci la descrizione dell'immagine qui
  2. Apri il browser e aggiorna la pagina o invia semplicemente la richiesta tramite client HTTP. inserisci la descrizione dell'immagine qui
  3. Dopo questo passaggio al Fiddler, dovresti vedere la tua richiesta: inserisci la descrizione dell'immagine qui
  4. In alto prova a navigare nella scheda “Raw”. inserisci la descrizione dell'immagine qui
  5. Nella finestra sottostante è la tua richiesta non elaborata inserisci la descrizione dell'immagine qui

Devo mancare qualcosa, perché ottenere la richiesta HTTP non elaborata come testo ASCII è davvero semplice, a patto che lo si imposti in Page_Init () sarà diverso da 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); }