Czy ktoś wie, jak mogę zmusić IIS do rejestrowania danych POST lub całego żądania HTTP?
Czy ktoś wie, jak mogę zmusić IIS do rejestrowania danych POST lub całego żądania HTTP?
Odpowiedzi:
Dzienniki IIS rejestrują tylko kwerendę i informacje nagłówkowe bez żadnych danych POST.
Jeśli używasz usług IIS7, możesz włączyć śledzenie nieudanych żądań dla kodu stanu 200. Spowoduje to zarejestrowanie wszystkich danych i możesz wybrać, który typ danych ma zostać uwzględniony.
W IIS6 lub 7 możesz użyć Application_BeginRequest w global.asax i stworzyć własne rejestrowanie danych POST.
Lub w IIS7 możesz napisać moduł HTTP z własnym logowaniem niestandardowym.
W kodzie zarządzanym można użyć metody Response.AppendToLog. Ta metoda doda dane do pola cs-uri-stem - całkowita długość wynosi do 4100 znaków (nieudokumentowane). Jeśli przekroczysz ten limit, wówczas zarejestrowana wartość zostanie zastąpiona przez „...”
Na przykład dodanie czegoś takiego do pliku Global.asax powinno załatwić sprawę (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
}
}
}
}
Doceniam to stare pytanie, ale okazało się, że ten kod dał mi dokładnie to, czego potrzebowałem, plik tekstowy z kompletnymi nagłówkami żądań i odpowiedzią, umieść go w pliku 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);
}
Spowoduje to utworzenie pliku tekstowego dla każdego żądania (w tym obrazów), więc bądź ostrożny tam, gdzie go używasz. Użyłem go tylko do rejestrowania konkretnych postów.
Wypróbuj to w pliku web.config, aby śledzić wszystko
<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>
Wygląda zachęcająco, chociaż jeszcze tego nie próbowałem:
https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log
Czym różni się to od innej oferowanej tutaj opcji, z kodem w pliku global.asax.cs? Działa to tylko w przypadku żądań stron ASP.NET, a nie innych stron, które IIS może przetwarzać (php, cgi, jsp, cfml). Łącze, które udostępniłem, jest modułem, który można włączyć w IIS dla dowolnej witryny (lub na poziomie serwera) w celu przetworzenia dowolnego typu żądania.