2015-10-28 4 views
-1

Я размещал веб-приложение в IIS7. С помощью сервера я могу программно отслеживать количество запросов и запросов от клиента.Можно ли программно отслеживать весь запрос от клиента на сервер в C#

Пожалуйста, советы

+0

В самом IIS мы можем отслеживать номер функции request.buit в функциональности – user3572575

+1

Вы видели регистрацию IIS https://technet.microsoft.com/en-us/library/cc732079(v=ws.10).aspx? Вам нужно больше, чем это? Если да, то что именно? – Polyfun

+1

Мне нужно больше ... нужно получить URL-адрес от клиента, параметры, если таковые имеются, время, количество уникальных URL-адресов. мы можем анализировать некоторые вещи из этих данных. – ganesh

ответ

2

В приложении вы можете реализовать Application_BeginRequest() (в global.asax)

Внутри этой функции вы можете использовать объект запроса, и вы, вероятно, заинтересованы в Request.Path, запрос. RawUrl, Request.UserHostAddress, Request.InputStream, Request.Form.AllKeys.

+1

Это полезно, но я не могу изменить любую часть размещенного приложения. Поэтому я ищу программно как отдельное приложение. – ganesh

2

Было бы лучше, если бы вы предоставили более подробную информацию о том, что вы будете делать с данными, например, если целью является получение аналитики, тогда я бы настоятельно рекомендовал вместо этого использовать Google Analytics или другие подобные продукты (AppInsights , WebTrends или другие).

Сказав, что вы можете, конечно, что без изменения приложения, вы можете написать управляемый модуль кода, который вы регистрируетесь на сервере через конфигурацию, реализующий IHttpModule, что-то вроде:

public class TrackingModule : IHttpModule 
{ 
    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += OnBeginRequest; 
    } 

    void OnBeginRequest(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     HttpRequest request = app.Context.Request; 
     if (request == null) 
     { 
      return; 
     } 

     string url = request.RawUrl; 
     string userAddress = request.UserHostAddress; 
     DateTime time = DateTime.UtcNow; 
     string userAgent = request.UserAgent; 

     // Store somewhere the data... 
    } 
} 

Долгое время назад, я дал несколько бесед о том, как расширить IIS и написал провайдер протоколов SQL, который может дать вам некоторый контекст. Для этого используется событие LogRequest, которое подходит именно для этого. Вам просто нужно настроить его в ApplicationHost.config или корневой web.config и вам не нужно будет изменить что-либо в приложении, и вы получите все, что:

#define TRACE 
using System; 
using System.Web; 
using System.Data.SqlClient; 
using System.Web.Hosting; 

public class SqlLoggingModule : IHttpModule { 
    public void Dispose() { 
    } 

    public void Init(HttpApplication context) { 
     context.LogRequest += new EventHandler(OnLogRequest); 
    } 

    void OnLogRequest(object sender, EventArgs e) { 
     HttpApplication app = (HttpApplication)sender; 
     try { 
      Log(app.Context); 
     } 
     catch (Exception ex) { 
      System.Diagnostics.Trace.TraceError(ex.ToString()); 

      app.Context.Trace.Warn(ex.ToString()); 
     } 
    } 

    private void Log(HttpContext ctx) { 
     string connectionString = @"server=(local);database=TechEd;uid=youruser;password=yourpassword;"; 

     // Disable Kernel Cache 
     ctx.Response.DisableKernelCache(); 

     using (SqlConnection connection = new SqlConnection(connectionString)) { 

      SqlCommand cmd = connection.CreateCommand(); 
      cmd.CommandText = 
       "insert into Log (Date, Method, IPAddress, Url, UserName, UserAgent, ResponseCode, SiteName, ApplicationName) values" + 
           "(@Date, @Method, @IPAddress, @Url, @UserName, @UserAgent, @ResponseCode, @SiteName, @ApplicationName)"; 

      cmd.Parameters.AddWithValue("@Date", DateTime.Now); 
      cmd.Parameters.AddWithValue("@Method", ctx.Request.HttpMethod); 
      cmd.Parameters.AddWithValue("@IPAddress", ctx.Request.UserHostAddress); 
      cmd.Parameters.AddWithValue("@Url", ctx.Request.Url.ToString()); 
      cmd.Parameters.AddWithValue("@UserName", ctx.Request.ServerVariables["LOGON_USER"]); 
      cmd.Parameters.AddWithValue("@UserAgent", ctx.Request.UserAgent); 
      cmd.Parameters.AddWithValue("@ResponseCode", ctx.Response.StatusCode + "." + ctx.Response.SubStatusCode); 
      cmd.Parameters.AddWithValue("@SiteName", HostingEnvironment.SiteName); 
      cmd.Parameters.AddWithValue("@ApplicationName", ctx.Request.ApplicationPath); 

      connection.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
    } 
}