65.9K
CodeProject 正在变化。 阅读更多。
Home

用于在 IIS 日志中记录 HTTP POST 数据的 HttpModule

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (8投票s)

2017年10月31日

CPOL

2分钟阅读

viewsIcon

49015

一个简单的技巧,允许您在标准的 IIS 日志中记录 HTTP POST 数据,而无需重写现有的 Web 应用程序。

引言

在 ASP.NET 应用程序中,有时需要记录 HTTP POST 数据以供将来分析(事件管理、统计等)。IIS 默认情况下会记录 HTTP GET 参数,使用标准日志记录功能,但本技巧是关于存储 HTTP POST 数据,这稍微复杂一些。 还有另一个功能,称为高级日志记录,允许您将任何数据存储在 IIS 日志中,但在这种情况下,您需要手动发布数据,这在您不想更改现有 Web 应用程序时不太有用。

背景

幸运的是,您可以使用两个很棒的功能来解决此问题。 第一个是 Response.AppendToLog,它指示 ASP.NET 将用户提供的数据附加到服务器生成的标准 IIS 日志中(您可以在 ASP.NET 管道中的任何点调用它)。 另一个是 HttpModule,可用于在不更改现有 Web 应用程序的情况下完成此操作。

Using the Code

只需在您的解决方案中创建一个新的类库并添加一个新类,该类实现 IHttpModule。 在 Init 方法中订阅 BeginRequest 事件,并处理您想要附加到日志的数据。 以下示例记录每个 POST 请求的所有数据

using System;
using System.Web;

namespace MySolution.HttpModules
{
    public class HttpPOSTLogger : IHttpModule
    {
        public void Dispose()
        {
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }

        private void context_BeginRequest(object sender, EventArgs e)
        {
            if (sender != null && sender is HttpApplication)
            {
                var request = (sender as HttpApplication).Request;
                var response = (sender as HttpApplication).Response;

                if (request != null && response != null && request.HttpMethod.ToUpper() == "POST")
                {
                    var body = HttpUtility.UrlDecode(request.Form.ToString());
                    if (!string.IsNullOrWhiteSpace(body))
                        response.AppendToLog(body);
                }
            }
        }
    }
}

不要忘记在应用程序的 web.config 中注册新创建的模块

对于 IIS 集成模式,请使用 system.WebServer 部分。

<system.webServer>
    <modules>
      <add name="HttpPOSTLogger" 
      type="MySolution.HttpModules.HttpPOSTLogger, MySolution.HttpModules" />
    </modules>
</system.webServer>

对于 IIS 经典模式,请使用 system.web 部分。

<system.web>
    <httpModules>
        <add name="HttpPOSTLogger" 
        type="MySolution.HttpModules.HttpPOSTLogger, MySolution.HttpModules"/>
    </httpModules>
</system.web>

设置完成后,启动您的应用程序并执行一些 POST 操作。 现在您会看到 IIS 创建的日志文件(默认情况下位于 c:\inetput\Logs 目录中)现在包含 POST 数据,而不是 "-" 符号。

以前

::1, -, 10/31/2017, 10:53:20, W3SVC1, machine-name, ::1, 5, 681, 662, 200, 0, POST, 
/MySolution/MyService.svc/MyMethod, -,

操作后

::1, -, 10/31/2017, 10:53:20, W3SVC1, machine-name, ::1, 5, 681, 662, 200, 0, POST, 
/MySolution/MyService.svc/MyMethod, 
{"model":{"Platform":"Mobile","EntityID":"420003"}},

应用

请小心使用此解决方案,因为为每个请求存储 POST 数据在磁盘存储方面会非常昂贵。 在我们的例子中,我们有兴趣存储发布到 Web 服务的极其小的 JSON 数据。

注释

如果尚未设置 IIS 日志记录,可以从“添加/删除 Windows 功能”或服务器管理器手动添加它。 完成此操作后,IIS 控制台应如下所示

日志输出示例以“IIS”格式提供,但您也可以使用“W3C”格式。

© . All rights reserved.