Corpo della richiesta di registro IIS / dati POST


Risposte:


32

I registri IIS registrano solo le informazioni su querystring e intestazione senza dati POST.

Se si utilizza IIS7, è possibile abilitare Traccia richieste non riuscite per il codice di stato 200. In questo modo verranno registrati tutti i dati e sarà possibile selezionare il tipo di dati da includere.

In IIS6 o 7, è possibile utilizzare Application_BeginRequest in global.asax e creare la propria registrazione dei dati POST.

Oppure, in IIS7, è possibile scrivere un modulo HTTP con la propria registrazione personalizzata.


+1 - Mi piace la tua risposta molto, molto meglio della mia. Ho chiaramente bisogno di leggere su traccia richieste non riuscite, dal momento che ovviamente non ho usato IIS7 quanto dovrei.
Evan Anderson,

Come puoi "selezionare quale tipo di dati includere"?
Pavel Chuchuva,

1
L'ultimo passaggio della procedura guidata durante la creazione di una regola FRT consente di selezionare quali dati includere. L'impostazione predefinita include tutto.
Scott Forsyth - MVP

Stavo cercando qualcosa per IIS6 ma mi sono imbattuto in questo link che mostra che la registrazione avanzata è un'opzione aggiuntiva per IIS7. iis.net/learn/extensions/advanced-logging-module/…
andyknas

Non sembra (da quell'URL condiviso da Andyknas) che i log di "registrazione avanzata" di IIS formano post. Offre un'opzione per la "registrazione client", che registra i post di un tipo particolare, ma non tutti i post dei moduli, che l'OP sembra richiedere (e mi stavo chiedendo, me stesso.)
charlie arehart,

8

Nel codice gestito è possibile utilizzare il metodo Response.AppendToLog. Questo metodo aggiungerà i dati al campo cs-uri-stem - la lunghezza totale è di 4100 caratteri (non documentata). Se si supera tale limite, il valore che sarebbe stato registrato viene sostituito con "..."

Ad esempio, aggiungere qualcosa di simile al tuo file Global.asax dovrebbe fare il trucco (C #):

void Application_EndRequest(Object Sender, EventArgs e)
{
    if( "POST" == Request.HttpMethod )
    {
        byte[] bytes    = Request.BinaryRead(Request.TotalBytes);
        string s    = Encoding.UTF8.GetString(bytes);
        if (!String.IsNullOrEmpty(s))
        {
            int QueryStringLength = 0;
            if (0 < Request.QueryString.Count)
            {
                QueryStringLength = Request.ServerVariables["QUERY_STRING"].Length;
                Response.AppendToLog( "&" );
            }

            if (4100 > ( QueryStringLength + s.Length ) )
            {
                Response.AppendToLog(s);
            }
            else
            {
                // append only the first 4090 the limit is a total of 4100 char.
                Response.AppendToLog(s.Substring(0, ( 4090 - QueryStringLength )));
                // indicate buffer exceeded
                Response.AppendToLog("|||...|||");
                // TODO: if s.Length >; 4000 then log to separate file
            }
        }       
    }
}
 

1
A partire da questo commento, il limite non è 4100, è 4KB che è 4096. Quindi questo codice deve essere leggermente modificato per registrare correttamente i dati POST> 4KB.
Steven V,

1
Ho dovuto aggiungere HttpContext.Current.Request.InputStream.Position = 0; prima della richiesta.BinaryRead, altrimenti restituirebbe un array vuoto
alex440

3

Mentre apprezzo che questa sia una vecchia domanda, ho scoperto che questo codice mi ha dato esattamente ciò di cui avevo bisogno, un file di testo con le intestazioni complete della richiesta e la risposta, inserendolo nel tuo global.asax.cs:

protected void Application_BeginRequest(Object Sender, EventArgs e)
{
    string uniqueid = DateTime.Now.Ticks.ToString();
    string logfile = String.Format("C:\\path\\to\\folder\\requests\\{0}.txt", uniqueid);
    Request.SaveAs(logfile, true);
}

Questo creerà un file di testo per ogni richiesta (comprese le immagini) quindi fai attenzione a dove lo usi. L'ho usato solo per registrare richieste di post specifiche.


1

Prova questo nel tuo file web.config per tracciare tutto

<tracing>
  <traceFailedRequests>
    <remove path="*" />
    <add path="*">
      <traceAreas>
        <add provider="ASP" verbosity="Verbose" />
        <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
        <add provider="ISAPI Extension" verbosity="Verbose" />
        <add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,FastCGI,WebSocket,Rewrite" verbosity="Verbose" />
      </traceAreas>
      <failureDefinitions timeTaken="00:00:00" statusCodes="200-999" />
    </add>
  </traceFailedRequests>
</tracing>

Ma nota che la funzione FRT limita implicitamente il numero di file di registro che crea (il che è una buona cosa), quindi dovresti cambiarlo, sia nell'interfaccia utente o tramite voci di file di configurazione - e con la dovuta cautela per il volume di registri che verrebbero creati anche in un'app Web modesta.
Charlie Arehart,

0

Questo sembra incoraggiante, anche se non l'ho ancora provato:

https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log

In che modo differisce dall'altra opzione offerta qui, con il codice in global.asax.cs? Funzionerebbe solo per le richieste di pagine ASP.NET, non altre pagine che IIS potrebbe elaborare (php, cgi, jsp, cfml). Il collegamento che ho condiviso è a un modulo che è possibile abilitare in IIS per qualsiasi sito (o a livello di server) per elaborare qualsiasi tipo di richiesta.


-4

Prova ad abilitare quanto segue nelle impostazioni del tuo registro IIS:

Metodo (metodo cs)

Stem URI (cs-uri-stem)

Query URI (cs-uri-query)


Ci ho provato, non ho aiutato ... :(
Budda,

3
Tali impostazioni non includeranno i dati POST
rob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.