web-dev-qa-db-fra.com

IIS Corps de demande de journal / POST Data

Est-ce que quelqu'un sait comment obtenir IIS pour consigner POST données ou la requête HTTP entière?)

35
Jim

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.

33

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
            }
        }       
    }
} 
 
8
Geoffrey McGrath

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.

4
Terry Kernan

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>
2
DeepSpace101

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.

0
charlie arehart