Weiß jemand, wie ich IIS veranlassen könnte, POST-Daten oder die gesamte HTTP-Anforderung zu protokollieren?
Weiß jemand, wie ich IIS veranlassen könnte, POST-Daten oder die gesamte HTTP-Anforderung zu protokollieren?
Antworten:
Die IIS-Protokolle zeichnen nur Abfrage- und Headerinformationen ohne POST-Daten auf.
Wenn Sie IIS7 verwenden, können Sie die Ablaufverfolgung fehlgeschlagener Anforderungen für Statuscode 200 aktivieren. Dadurch werden alle Daten aufgezeichnet, und Sie können auswählen, welcher Datentyp einbezogen werden soll.
In IIS6 oder 7 können Sie Application_BeginRequest in global.asax verwenden und Ihre eigene Protokollierung von POST-Daten erstellen.
In IIS7 können Sie auch ein HTTP-Modul mit Ihrer eigenen benutzerdefinierten Protokollierung schreiben.
In verwaltetem Code können Sie die Response.AppendToLog-Methode verwenden. Diese Methode hängt Daten an das Feld cs-uri-stem an - die Gesamtlänge beträgt bis zu 4100 Zeichen (undokumentiert). Wenn Sie diesen Grenzwert überschreiten, wird der Wert, der protokolliert worden wäre, durch "..." ersetzt.
Wenn Sie Ihrer Datei "Global.asax" beispielsweise etwas Ähnliches hinzufügen, reicht das aus (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
}
}
}
}
Obwohl ich zu schätzen weiß, dass dies eine alte Frage ist, fand ich, dass dieser Code mir genau das gab, was ich brauchte:
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);
}
Dadurch wird für jede Anfrage eine Textdatei erstellt (einschließlich Bilder). Seien Sie also vorsichtig, wo Sie sie verwenden. Ich habe es nur verwendet, um bestimmte Post-Anfragen zu protokollieren.
Versuchen Sie dies in Ihrer web.config-Datei, um alles zu verfolgen
<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>
Das sieht ermutigend aus, obwohl ich es noch nicht ausprobiert habe:
https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log
Wie unterscheidet sich dies von der anderen hier angebotenen Option mit Code in der Datei global.asax.cs? Dies funktioniert nur für ASP.NET-Seitenanforderungen, nicht für andere Seiten, die IIS möglicherweise verarbeitet (PHP, CGI, JSP, CFML). Der Link, den ich freigegeben habe, bezieht sich auf ein Modul, das in IIS für jeden Standort (oder auf Serverebene) zur Verarbeitung für jede Art von Anforderung aktiviert werden kann.