IIS'nin POST verilerini veya HTTP isteğinin tamamını kaydetmesini nasıl sağlayabileceğimi bilen var mı?
IIS'nin POST verilerini veya HTTP isteğinin tamamını kaydetmesini nasıl sağlayabileceğimi bilen var mı?
Yanıtlar:
IIS, POST verileri olmadan yalnızca kayıt sorgulama ve başlık bilgilerini kaydeder.
IIS7 kullanıyorsanız, durum kodu 200 için Başarısız İstek İzleme özelliğini etkinleştirebilirsiniz. Bu, tüm verileri kaydeder ve dahil edilecek verilerin türünü seçebilirsiniz.
IIS6 veya 7'de global.asax'ta Application_BeginRequest'i kullanabilir ve kendi POST verileri günlüğünüzü oluşturabilirsiniz.
Veya, IIS7'de kendi özel günlüğünüzle bir HTTP Modülü yazabilirsiniz.
Yönetilen kodda Response.AppendToLog yöntemini kullanabilirsiniz. Bu yöntem cs-uri-stem alanına veri ekler - toplam uzunluk 4100 karaktere kadardır (belgesiz). Bu limiti aşarsanız, kaydedilmiş olan değer "..." ile değiştirilir.
Örneğin, Global.asax dosyanıza böyle bir şey eklemek hile yapmalı (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
}
}
}
}
Bunun eski bir soru olduğunu takdir etmeme rağmen, bu kodun bana tam ihtiyacım olan şeyi verdiğini, istek başlıklarının tamamını ve yanıtını içeren bir metin dosyasının global.asax.cs içine koyduğunu gördüm:
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);
}
Bu, her istek için (resimler dahil) bir metin dosyası oluşturacaktır, bu nedenle nerede kullandığınıza dikkat edin. Sadece belirli gönderi isteklerini kaydetmek için kullandım.
Her şeyi izlemek için bunu web.config dosyanızda deneyin
<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>
Bu, henüz denememiş olmama rağmen, cesaret verici görünüyor:
https://www.codeproject.com/Tips/1213108/HttpModule-for-Logging-HTTP-POST-Data-in-IIS-Log
Bu, global.asax.cs koduyla birlikte burada sunulan diğer seçeneklerden ne kadar farklıdır? Bu yalnızca ASP.NET sayfa istekleri için işe yarayacaktır, IIS'nin işleyebileceği diğer sayfalar (php, cgi, jsp, cfml) için geçerli değildir. Paylaştığım bağlantı, herhangi bir istek için herhangi bir sitenin (veya sunucu düzeyinde) IIS'de etkinleştirebileceği bir modüldür.