¿Alguien sabe cómo podría hacer que IIS registre datos POST o toda la solicitud HTTP?
¿Alguien sabe cómo podría hacer que IIS registre datos POST o toda la solicitud HTTP?
Respuestas:
Los registros de IIS solo registran la cadena de consulta y la información del encabezado sin ningún dato POST.
Si está utilizando IIS7, puede habilitar el seguimiento de solicitudes fallidas para el código de estado 200. Eso registrará todos los datos y podrá seleccionar qué tipo de datos incluir.
En IIS6 o 7, puede usar Application_BeginRequest en global.asax y crear su propio registro de datos POST.
O, en IIS7, puede escribir un Módulo HTTP con su propio registro personalizado.
En el código administrado, puede usar el método Response.AppendToLog. Este método agregará datos al campo cs-uri-stem; la longitud total es de hasta 4100 caracteres (sin documentar). Si excede ese límite, el valor que se habría registrado se reemplaza con "..."
Por ejemplo, agregar algo como esto a su archivo Global.asax debería hacer el truco (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
}
}
}
}
Si bien aprecio que esta es una pregunta anterior, descubrí que este código me dio exactamente lo que necesitaba, un archivo de texto con los encabezados de solicitud completos y la respuesta, lo puso en su 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);
}
Esto creará un archivo de texto para todas y cada una de las solicitudes (incluidas las imágenes), así que tenga cuidado donde lo use. Solo lo usé para registrar solicitudes de publicación específicas.
Pruebe esto en su archivo web.config para rastrear todo
<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>
Esto parece alentador, aunque todavía no lo he probado:
https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log
¿Cómo difiere esto de la otra opción ofrecida aquí, con código en global.asax.cs? Eso solo funcionaría para las solicitudes de página ASP.NET, no para otras páginas que IIS podría procesar (php, cgi, jsp, cfml). El enlace que compartí es a un módulo que uno podría habilitar en IIS para que cualquier sitio (o en el nivel del servidor) procese cualquier tipo de solicitud.