Дані органу / запиту публікації журналу 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.