Дані органу / запиту публікації журналу IIS


Відповіді:


32

IIS реєструє лише запити рядків запитів та заголовків без будь-яких даних POST.

Якщо ви використовуєте IIS7, ви можете ввімкнути Не вдалося відстежувати запит на код статусу 200. У ньому будуть записані всі дані, і ви можете вибрати, який тип даних включати.

У IIS6 або 7 ви можете використовувати Application_BeginRequest в global.asax та створити свій власний журнал даних POST.

Або в IIS7 ви можете написати модуль HTTP з власним користувальницьким журналом.


+1 - Ваша відповідь мені подобається набагато краще, ніж моя власна. Мені чітко потрібно прочитати невдалий пошук запиту, оскільки я, очевидно, не використовував IIS7 так сильно, як повинен.
— Еван Андерсон

Як можна "вибрати, який тип даних включати"?
— Павло Чучува

1
Останній крок майстра при створенні правила FRT дозволяє вибрати, які дані включати. Він за замовчуванням включає все.
— Скотт Форсайт - MVP

Я шукав щось для IIS6, але натрапив на це посилання, на якому показано, що розширений журнал - це доповнення для IIS7. iis.net/learn/extensions/advanced-logging-module/…
— andyknas

Не видається (з цього спільного URL-адреси Andyknas), що IIS "розширений журнал" формує записи. Він пропонує опцію "ведення журналу клієнтів", яка б реєструвала повідомлення певного роду, але не всі форми форми, про які, схоже, запитує ОП (і мені це цікаво, про себе).
— Charlie arehart

8

В керованому коді можна використовувати метод 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
            }
        }       
    }
}
 

1
Що стосується цього коментаря, то обмеження не 4100, це 4 КБ, що становить 4096. Отже, цей код потрібно трохи змінити, щоб коректно ввести дані POST> 4 КБ.
— Стівен V

1
Мені довелося додати HttpContext.Current.Request.InputStream.Position = 0; перед запитом.BinaryRead, інакше він поверне порожній масив
— alex440

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);
}

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


1

Спробуйте це у файлі 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>

Але зауважте, що функція FRT неявно обмежує кількість створених ними файлів журналів (що добре), тому вам потрібно буде це змінити або в інтерфейсі користувача, або через записи конфігураційних файлів - і з належною обережністю щодо обсягу журнали, які можна було б створити навіть у скромному веб-додатку.
— charlie arehart

0

Це виглядає обнадійливо, хоча я ще не пробував цього:

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


-4

Спробуйте ввімкнути наступне у налаштуваннях журналу IIS:

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

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

URI-запит (cs-uri-запит)


Я спробував, не допомогли ... :(
— Будда

3
Ці налаштування не включатимуть дані POST
— обійдіть
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.