Dados do Corpo da Solicitação de Log do IIS / POST


Respostas:


32

O IIS registra apenas as informações da cadeia de caracteres e do cabeçalho da consulta sem nenhum dado POST.

Se você estiver usando o IIS7, poderá ativar o Rastreamento de solicitação com falha para o código de status 200. Isso registrará todos os dados e você poderá selecionar qual tipo de dados incluir.

No IIS6 ou 7, você pode usar o Application_BeginRequest no global.asax e criar seu próprio log de dados do POST.

Ou, no IIS7, você pode escrever um módulo HTTP com seu próprio log personalizado.


+1 - Gosto muito da sua resposta, muito melhor que a minha. Eu claramente preciso ler o rastreamento de solicitações com falha, pois obviamente não usei o IIS7 tanto quanto deveria.
Evan Anderson

Como você pode "selecionar qual tipo de dados incluir"?
Pavel Chuchuva

1
A última etapa do assistente ao criar uma regra FRT permite selecionar quais dados incluir. O padrão é incluir tudo.
Scott Forsyth - MVP

Eu estava procurando algo para o IIS6, mas me deparei com este link que mostra o log avançado como uma opção de complemento para o IIS7. iis.net/learn/extensions/advanced-logging-module/…
andyknas

Não parece (a partir desse URL que Andyknas compartilhou) que os logs de "log avançado" do IIS formem postagens. Ele oferece uma opção para "log de cliente", que registraria postagens de um tipo específico, mas nem todas as postagens de formulário, que o OP parece estar solicitando (e eu estava pensando sobre isso.)
charlie arehart

8

No código gerenciado, você pode usar o método Response.AppendToLog. Este método anexará dados ao campo cs-uri-stem - o comprimento total é de até 4100 caracteres (não documentado). Se você exceder esse limite, o valor que seria registrado será substituído por "..."

Por exemplo, adicionar algo assim ao seu arquivo Global.asax deve fazer o truque (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
            }
        }       
    }
}
 

1
No momento deste comentário, o limite não é 4100, é 4KB que é 4096. Portanto, esse código precisa ser modificado levemente para registrar dados POST> 4KB corretamente.
Steven V

1
Eu tive que adicionar HttpContext.Current.Request.InputStream.Position = 0; antes Request.BinaryRead, caso contrário, iria retornar matriz vazia
alex440

3

Embora eu aprecie que essa seja uma pergunta antiga, achei que esse código me deu exatamente o que eu precisava, um arquivo de texto com os cabeçalhos completos da solicitação e a resposta, coloque-o no seu 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);
}

Isso criará um arquivo de texto para cada solicitação (incluindo imagens); portanto, tenha cuidado com o local em que a usar. Eu apenas o usei para registrar solicitações de postagem específicas.


1

Tente isso no seu arquivo web.config para rastrear tudo

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

Mas observe que o recurso FRT limita implicitamente o número de arquivos de log que ele cria (o que é uma coisa boa); portanto, você precisará alterar isso, na interface do usuário ou nas entradas do arquivo de configuração - e com o devido cuidado com o volume de logs que seriam criados mesmo em um aplicativo da Web modesto.
charlie arehart 16/02

0

Isso parece encorajador, embora ainda não o tenha experimentado:

https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log

Como isso difere da outra opção oferecida aqui, com código no global.asax.cs? Isso funcionaria apenas para solicitações de página do ASP.NET, e não para outras páginas que o IIS possa processar (php, cgi, jsp, cfml). O link que eu compartilhei é um módulo que se pode habilitar no IIS para qualquer site (ou no nível do servidor) processar para qualquer tipo de solicitação.


-4

Tente ativar o seguinte nas configurações de log do IIS:

Método (método cs)

Haste URI (haste cs-uri)

Consulta de URI (cs-uri-query)


Eu tentei, não ajudou ... :(
Budda

3
Essas configurações não incluirão dados POST
rob
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.