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