IIS 日志请求正文/POST 数据

IIS 日志请求正文/POST 数据

有人知道如何让 IIS 记录 POST 数据或整个 HTTP 请求吗?

答案1

IIS 日志仅记录查询字符串和标头信息,没有任何 POST 数据。

如果您使用的是 IIS7,则可以启用状态代码 200 的失败请求跟踪。这将记录所有数据,您可以选择要包含的数据类型。

无论是在 IIS6 还是 7 中,您都可以使用 global.asax 中的 Application_BeginRequest 并创建自己的 POST 数据日志记录。

或者,在 IIS7 中,您可以使用自己的自定义日志记录编写 HTTP 模块。

答案2

在托管代码中,您可以使用 Response.AppendToLog 方法。此方法将数据附加到 cs-uri-stem 字段 - 总长度最多为 4100 个字符(未记录)。如果超出该限制,则将记录的值替换为“...”

例如,将如下内容添加到您的 Global.asax 文件就可以了(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
            }
        }       
    }
}
 

答案3

虽然我知道这是一个老问题,但我发现这段代码给了我我需要的东西,一个包含完整请求标头和响应的文本文件,将其放入你的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);
}

这将为每个请求(包括图像)创建一个文本文件,因此请谨慎使用它。我只用它来记录特定的帖子请求。

答案4

虽然我还没有尝试过,但这看起来令人鼓舞:

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

这与此处提供的其他选项(代码在 global.asax.cs 中)有何不同?这仅适用于 ASP.NET 页面请求,而不适用于 IIS 可能处理的其他页面(php、cgi、jsp、cfml)。我分享的链接指向一个模块,可以在 IIS 中为任何站点(或在服务器级别)启用该模块来处理任何类型的请求。

相关内容