Ведение журнала данных запроса сервера (включая данные POST) в веб-формах IIS 6 / ASP.NET - PullRequest
7 голосов
/ 05 октября 2010

Вот большая картина.В IIS 6 мы запускаем сервер, на котором размещены несколько веб-сайтов и приложений, и в настоящее время мы переносим все это в другой центр обработки данных с несколько иной настройкой.Мы уведомили наших пользователей и обновили информацию о DNS, так что теоретически все будут счастливы получить доступ к новому серверу с первого дня, но мы знаем, что кто-то неизбежно провалится.Страница / обработчик «слушателя», которая будет получать все запросы к серверу и записывать весь запрос в текстовый файл, включая (особенно) данные POST.

Вот где я застрял.Я не знаю, как реализовать один обработчик, который будет получать все запросы к серверу.Я смутно понимаю параметры перенаправления IIS 6, но все они, похоже, теряют данные POST при перенаправлении.Я также немного знаю о встроенной регистрации в IIS 6, но она также игнорирует данные POST.

Существует ли простой (ish) способ направить все запросы на сервер, чтобы они все обращались к одному обработчику, сохраняя данные постов?

РЕДАКТИРОВАТЬ: Это в WebForms, если это имеет значение, но другие решения (если небольшие), безусловно, стоит рассмотреть.

Ответы [ 2 ]

10 голосов
/ 06 октября 2010

Если все запросы относятся к формам POST для форм ASP.NET, вы можете добавить HttpModule для сбора и регистрации этих данных.

Вам также не придется перестраивать все приложения для развертывания.Все, что нужно, это поместить HttpModule в папку /bin каждого приложения и добавить его в раздел <httpModules> ваших файлов web.config.Например:

using System;
using System.Diagnostics;
using System.Web;

public class SimpleLogger : IHttpModule
{
  private HttpApplication _application;

  public void Dispose() { }

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

  void Context_BeginRequest(object sender, EventArgs e)
  {
    foreach (string key in _application.Request.Form.AllKeys)
    {
      // You can get everything on the Request object at this point
      // Output to debug but you'd write to a file or a database here.
      Debug.WriteLine(key + "=" + _application.Request.Form[key]);
    }
  }
}

В ваш файл web.config добавьте регистратор:

<httpModules>
  <add name="MyLogger" type="SimpleLogger, SimpleLogger"/>
</httpModules>

Будьте осторожны.Если ваш сайт фиксирует данные кредитной карты или другие конфиденциальные данные.Вам может потребоваться убедиться, что это отфильтровано или зашифровано, и от персонала, который не должен видеть эту информацию.

Также, если вы регистрируетесь в файлах, убедитесь, что файлы журналов находятся вне каких-либообщедоступные веб-папки.

0 голосов
/ 01 ноября 2017

Вот код пользовательского модуля HTTP, который мы используем для регистрации данных запроса HTTP 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 вашего приложения.

Использование раздела system.WebServer для интегрированной модели IIS

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

Используйте раздел system.web для IIS Classic Model

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

Журнал IIS Перед применением модуля:

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

Журнал IIS После применения модуля:

::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"}},

Полная статья:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...