Est-ce que quelqu'un sait comment obtenir IIS pour consigner POST données ou la requête HTTP entière?)
Les journaux IIS enregistrent uniquement les informations de la chaîne de requête et de l'en-tête sans aucune donnée 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.
Dans le 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 4100 caractères (non documentée). Si vous dépassez cette limite, la valeur qui aurait été enregistrée est remplacée par "..."
Par exemple, ajouter quelque chose comme ça à 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 j'apprécie qu'il s'agit d'une vieille question, j'ai trouvé que ce code m'a donné exactement ce dont j'avais besoin, un fichier texte avec les en-têtes de demande 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 demande (y compris les images), alors faites attention où 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 suivre
<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 pour les autres pages IIS pourrait traiter (php, cgi, jsp, cfml). Le lien que j'ai partagé est vers un module que l'on pourrait activer dans = IIS pour tout site (ou au niveau du serveur) à traiter pour tout type de demande.