Có ai biết làm thế nào tôi có thể lấy IIS để ghi dữ liệu POST hoặc toàn bộ yêu cầu HTTP không?
Có ai biết làm thế nào tôi có thể lấy IIS để ghi dữ liệu POST hoặc toàn bộ yêu cầu HTTP không?
Câu trả lời:
Nhật ký IIS chỉ ghi thông tin chuỗi truy vấn và tiêu đề mà không có bất kỳ dữ liệu POST nào.
Nếu bạn đang sử dụng IIS7, bạn có thể bật Truy tìm yêu cầu thất bại cho mã trạng thái 200. Điều đó sẽ ghi lại tất cả dữ liệu và bạn có thể chọn loại dữ liệu sẽ bao gồm.
Trong IIS6 hoặc 7, bạn có thể sử dụng Application_BeginRequest trong global.asax và tạo nhật ký dữ liệu POST của riêng bạn.
Hoặc, trong IIS7, bạn có thể viết Mô-đun HTTP bằng nhật ký tùy chỉnh của riêng bạn.
Trong mã được quản lý, bạn có thể sử dụng phương thức Feedback.AppendToLog. Phương pháp này sẽ nối dữ liệu vào trường cs-uri-thân - tổng chiều dài lên tới 4100 ký tự (không có giấy tờ). Nếu bạn vượt quá giới hạn đó, thì giá trị đã được ghi lại sẽ được thay thế bằng "..."
Chẳng hạn, việc thêm một cái gì đó như thế này vào tệp Global.asax của bạn sẽ thực hiện thủ thuật (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
}
}
}
}
Mặc dù tôi đánh giá cao rằng đây là một câu hỏi cũ, tôi thấy mã này đã cung cấp cho tôi chính xác những gì tôi cần, một tệp văn bản với tiêu đề yêu cầu đầy đủ và phản hồi, đưa nó vào global.asax.cs của bạn:
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);
}
Điều này sẽ tạo một tệp văn bản cho mỗi và mọi yêu cầu (bao gồm cả hình ảnh), vì vậy hãy cẩn thận khi bạn sử dụng nó. Tôi chỉ sử dụng nó để đăng nhập yêu cầu bài cụ thể.
Hãy thử điều này trong tệp web.config để theo dõi mọi thứ
<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>
Điều này có vẻ đáng khích lệ, mặc dù tôi chưa thử nó:
https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log
Điều này khác với tùy chọn khác được cung cấp ở đây như thế nào, với mã trong global.asax.cs? Điều đó sẽ chỉ hoạt động cho các yêu cầu trang ASP.NET, không phải các trang khác IIS có thể xử lý (php, cgi, jsp, cfml). Liên kết tôi chia sẻ là một mô-đun mà người ta có thể kích hoạt trong IIS cho bất kỳ trang web nào (hoặc ở cấp độ máy chủ) để xử lý cho bất kỳ loại yêu cầu nào.