Qualcuno sa come potrei ottenere IIS per registrare i dati POST o l'intera richiesta HTTP?
Qualcuno sa come potrei ottenere IIS per registrare i dati POST o l'intera richiesta HTTP?
Risposte:
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.
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
}
}
}
}
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.
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>
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.