2012-01-01 9 views
-1

J'ai posé une question au sujet de la création d'un enregistreur IIS, mais je suis encore avoir quelques problèmes:problèmes IHttpModule

  1. message d'origine est perdu
  2. message de réponse n'est pas capturé

Serait-il possible d'obtenir ces 2 triés?

IHttpHandler:

using System.Web; 
using System.IO; 

namespace MyLogger 
{ 
    public class MyHandler : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
      context.Response.Write("The page request is " + context.Request.RawUrl.ToString()); 
      StreamWriter sw = new StreamWriter(@"C:\requestLog.txt", true); 
      sw.WriteLine("Page requested at " + DateTime.Now.ToString() + context.Request.RawUrl); 
      sw.Close(); 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return true; 
      } 
     } 
    } 
} 

IHttpModule:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Web; 
using System.IO; 

namespace MyLogger 
{ 
    public class MyModule : IHttpModule 
    { 
     public InterceptorModule() 
     { } 
     public void Init(HttpApplication objApplication) 
     { 
      // Register event handler of the pipe line 
      objApplication.BeginRequest += new EventHandler(this.ContextBeginRequest); 
      objApplication.EndRequest += new EventHandler(this.ContextEndRequest); 
     } 
     public void Dispose() 
     { 
     } 
     public void ContextEndRequest(object sender, EventArgs e) 
     { 
      StreamWriter sw = new StreamWriter(@"C:\requestLog.txt", true); 
      sw.WriteLine("End Request called at " + DateTime.Now.ToString()); sw.Close(); 
     } 
     public void ContextBeginRequest(object sender, EventArgs e) 
     { 
      StreamWriter sw = new StreamWriter(@"C:\requestLog.txt", true); 
      sw.WriteLine("Begin request called at " + DateTime.Now.ToString()); sw.Close(); 
     } 
    } 
} 

Mon post précédent: IIS API Monitor in a web application Merci à l'avance!

+2

* Êtes-vous sérieux au sujet * wo rking avec un seul fichier physique dans un environnement fortement multi-threadé * de cette façon *? –

+0

S'il vous plaît assurez-vous de marquer votre réponse dans votre autre question afin que les futurs lecteurs puissent apprendre de vos expériences. –

+0

Je le mets juste là pour la simplicité. Mes questions ne concernent pas le multi-threading, c'est pourquoi je l'ai laissé de côté. En tout cas, j'ai marqué la réponse utile, mais pour une raison ou une autre, cela ne s'est pas reflété sur la page. Et j'ai laissé mes conclusions dans la section des commentaires pour référence future. – Raytrace

Répondre

1

Je ne suis pas sûr de ce que le point de la HTTPHandler est, mais toute la journalisation peut être effectuée à partir du HTTPModule. Cependant, votre code a besoin d'une amélioration substantielle pour survivre.

1) Vous devriez avoir des blocs try/catch autour des streamwriters pour vous assurer que les exceptions non gérées ne sont pas levées, surtout si vous essayez d'être discret. 2) Le code du streamwriter doit être encapsulé dans un bloc using pour s'assurer que vous n'avez pas de ressources.

3) Comme vous pourriez potentiellement avoir plusieurs threads essayant d'écrire simultanément dans le fichier, vous devez envelopper le code d'écriture dans un bloc de verrouillage.

4) Vous pouvez utiliser HttpContext.Current.Request pour accéder à la requête en cours, que je suppose être ce que vous avez fait dans le HttpModule. Si ce n'était pas l'intention, nous aurons besoin de clarifications supplémentaires.

5) Si vous démarrez l'application en mode débogage et que la méthode Init n'est pas atteinte, vos entrées web.config sont incorrectes. Le type doit être pleinement qualifié (c.-à inclure l'espace de noms) et vous devez ajouter à la fois la configuration intégrée et le mode de classe:

mode classique (IIS 6, IIS 7+ classique)

<configuration> 
    <system.web> 
    <httpModules> 
     <add name="MyModule" type="MyNamespace.MyModule"/> 
    </httpModules> 
    </system.web> 
</configuration> 

mode intégré (IIS 7+ intégré)

<configuration> 
    <system.webServer> 
    <modules> 
     <add name="MyModule" type="MyNamespace.MyModule"/> 
    </modules> 
    </system.webServer> 
</configuration> 

Voici le code réécrite:

static Object m_LockObject = new Object(); 

    public void Init(HttpApplication objApplication) 
    { 
     // Register event handler of the pipe line 
     objApplication.BeginRequest += new EventHandler(this.ContextBeginRequest); 
     objApplication.EndRequest += new EventHandler(this.ContextEndRequest); 
    } 
    public void ContextEndRequest(object sender, EventArgs e) 
    { 
     try 
     { 
      lock (m_LockObject) 
      { 
       using (StreamWriter sw = new StreamWriter(@"C:\requestLog.txt", true)) 
       { 
        sw.WriteLine("End request called at " + DateTime.Now.ToString() + "; URL: " + HttpContext.Current.Request.RawUrl.ToString()); 
       } 
      } 

      // Write the response back to the caller 
      HttpContext.Current.Response.Write("The page request is " + HttpContext.Current.Request.RawUrl.ToString()); 

     } 
     catch 
     { 
     } 
    } 
    public void ContextBeginRequest(object sender, EventArgs e) 
    { 
     try 
     { 
      lock (m_LockObject) 
      { 
       using (StreamWriter sw = new StreamWriter(@"C:\requestLog.txt", true)) 
       { 
        sw.WriteLine("Begin request called at " + DateTime.Now.ToString() + "; URL: " + HttpContext.Current.Request.RawUrl.ToString()); 
       } 
      } 
     } 
     catch 
     { 
     } 
    } 
+0

Merci pour votre réponse, mais cela ne répond pas à mon besoin de consigner et de transmettre le message original au client appelant. Serait-ce possible avec HttpModule et/ou HttpHandler? – Raytrace

+0

@Raytrace: Oui, cela peut absolument être fait en utilisant 'HttpContext.Current.Response.Write'.Désolé, j'ai manqué cela dans le httpmodule original. J'ai mis à jour la réponse afin que cela soit fait dans 'ContextEndRequest' et en tant que tel, il apparaît au bas de la page. –

+0

Trouvé ma réponse ici pour référence future: http://forums.asp.net/post/2417324.aspx – Raytrace

Questions connexes