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