Назад | Перейти на главную страницу

Тело запроса журнала IIS / данные POST

Кто-нибудь знает, как я могу заставить IIS регистрировать данные POST или весь HTTP-запрос?

IIS регистрирует только информацию о строке запроса и заголовке без каких-либо данных POST.

Если вы используете IIS7, вы можете включить отслеживание неудачных запросов для кода состояния 200. При этом будут записаны все данные, и вы сможете выбрать, какой тип данных включить.

В IIS6 или 7 вы можете использовать Application_BeginRequest в global.asax и создать собственный журнал данных POST.

Или в IIS7 вы можете написать модуль HTTP со своим собственным журналом.

В управляемом коде вы можете использовать метод 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
            }
        }       
    }
}
 

Хотя я понимаю, что это старый вопрос, я обнаружил, что этот код дал мне именно то, что мне было нужно, текстовый файл с полными заголовками запроса и ответом, поместите его в свой 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);
}

Это создаст текстовый файл для каждого запроса (включая изображения), поэтому будьте осторожны при его использовании. Я использовал его только для регистрации определенных почтовых запросов.

Попробуйте это в своем файле web.config, чтобы отслеживать все

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

Выглядит обнадеживающе, хотя я еще не пробовал:

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 для любого сайта (или на уровне сервера) для обработки любого типа запроса.

Попробуйте включить следующее в настройках журнала IIS:

Метод (cs-метод)

Стебель URI (cs-uri-stem)

Запрос URI (cs-uri-query)