Alguém sabe como eu poderia obter o IIS para registrar dados POST ou a solicitação HTTP inteira?
Alguém sabe como eu poderia obter o IIS para registrar dados POST ou a solicitação HTTP inteira?
Respostas:
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.
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
}
}
}
}
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.
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>
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.