Хтось знає, як я можу отримати IIS для реєстрації даних POST або всього HTTP запиту?
Хтось знає, як я можу отримати 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 для будь-якого сайту (або на рівні сервера) для обробки будь-якого типу запиту.