Est-ce que quelqu'un sait comment je pourrais obtenir IIS pour enregistrer les données POST ou l'intégralité de la requête HTTP?
Est-ce que quelqu'un sait comment je pourrais obtenir IIS pour enregistrer les données POST ou l'intégralité de la requête HTTP?
Réponses:
Les journaux IIS enregistrent uniquement les informations de chaîne de requête et d’en-tête sans données POST.
Si vous utilisez IIS7, vous pouvez activer le suivi des demandes ayant échoué pour le code d'état 200. Cela enregistrera toutes les données et vous pourrez sélectionner le type de données à inclure.
Dans IIS6 ou 7, vous pouvez utiliser Application_BeginRequest dans global.asax et créer votre propre journalisation des données POST.
Ou, dans IIS7, vous pouvez écrire un module HTTP avec votre propre journalisation personnalisée.
En code managé, vous pouvez utiliser la méthode Response.AppendToLog. Cette méthode ajoutera des données au champ cs-uri-stem - la longueur totale peut atteindre 4 100 caractères (non documentés). Si vous dépassez cette limite, la valeur qui aurait été enregistrée est remplacée par "..."
Par exemple, ajouter quelque chose comme ceci à votre fichier Global.asax devrait faire l'affaire (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
}
}
}
}
Bien que je comprenne que c’est une vieille question, j’ai trouvé que ce code me donnait exactement ce dont j'avais besoin: un fichier texte avec les en-têtes de requête complets et la réponse, mettez-le dans votre 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);
}
Cela créera un fichier texte pour chaque requête (y compris les images), alors soyez prudent lorsque vous l'utilisez. Je ne l'ai utilisé que pour enregistrer des demandes de publication spécifiques.
Essayez ceci dans votre fichier web.config pour tout tracer
<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>
Cela semble encourageant, même si je ne l’ai pas encore essayé:
https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log
En quoi cela diffère-t-il de l'autre option proposée ici, avec du code dans le fichier global.asax.cs? Cela ne fonctionnerait que pour les demandes de page ASP.NET, pas d'autres pages qu'IIS pourrait traiter (php, cgi, jsp, cfml). Le lien que j'ai partagé est un module que l'on pourrait activer dans IIS pour tout site (ou au niveau du serveur) pour traiter tout type de demande.