Yêu cầu đăng nhập IIS Body / POST Data


Câu trả lời:


32

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.


+1 - Tôi thích câu trả lời của bạn xa, tốt hơn nhiều so với của tôi. Tôi rõ ràng cần phải đọc lên theo dõi yêu cầu thất bại, vì rõ ràng tôi đã không sử dụng IIS7 nhiều như tôi nên.
Evan Anderson

Làm thế nào bạn có thể "chọn loại dữ liệu để bao gồm"?
Pavel Chuchuva

1
Bước cuối cùng của trình hướng dẫn khi tạo quy tắc FRT cho phép bạn chọn dữ liệu cần bao gồm. Nó mặc định bao gồm tất cả mọi thứ.
Scott Forsyth - MVP

Tôi đang tìm kiếm một cái gì đó cho IIS6 nhưng tình cờ thấy liên kết này cho thấy ghi nhật ký nâng cao là một tùy chọn bổ trợ cho IIS7. iis.net/learn/extensions/advanced-logging-module/...
andyknas

Nó không xuất hiện (từ url mà Andyknas đã chia sẻ) rằng các bản ghi nhật ký "đăng nhập nâng cao" của IIS. Nó cung cấp một tùy chọn cho "ghi nhật ký khách hàng", sẽ đăng các bài đăng thuộc một loại cụ thể, nhưng không phải tất cả các bài đăng mẫu, mà OP dường như đang yêu cầu (và tôi đã tự hỏi về bản thân mình.)
charlie bắt đầu

8

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
            }
        }       
    }
}
 

1
Theo nhận xét này, giới hạn không phải là 4100, đó là 4KB là 4096. Vì vậy, mã này cần được sửa đổi một chút để ghi nhật ký dữ liệu POST> 4KB chính xác.
Steven V

1
Tôi đã phải thêm HttpContext.Cản.Request.InputStream.Pocation = 0; trước request.BinaryRead, nếu không nó sẽ trả về mảng trống
alex440

3

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ể.


1

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>

Nhưng lưu ý rằng tính năng FRT hoàn toàn giới hạn số lượng tệp nhật ký mà nó tạo ra (đây là một điều tốt), vì vậy bạn sẽ cần phải thay đổi điều đó, trong UI hoặc thông qua các mục nhập tệp cấu hình - và thận trọng đối với khối lượng của nhật ký sẽ được tạo trong một ứng dụng web khiêm tốn.
charlie bắt đầu

0

Đ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.


-4

Hãy thử bật các mục sau trong cài đặt nhật ký IIS của bạn:

Phương thức (phương thức cs)

Thân cây URI (cs-uri-thân)

Truy vấn URI (cs-uri-query)


Tôi đã thử, không giúp được gì ... :(
Budda

3
Những cài đặt đó sẽ không bao gồm dữ liệu POST
cướp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.