2012-01-01 3 views
-1

Я задал вопрос о создании регистратора IIS, но все еще имею пару вопросов:IHttpModule проблемы

  1. Оригинальное сообщение потерянное
  2. Ответное сообщение не улавливается

Было бы вообще возможно, чтобы эти 2 разобрались?

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(); 
     } 
    } 
} 

Мой предыдущий пост: IIS API Monitor in a web application Заранее спасибо!

+2

вы * серьезно * о горе rking с одним физическим файлом в сильно многопоточной среде * таким образом *? –

+0

Обязательно отметьте свой ответ в другом вопросе, чтобы будущие читатели могли учиться на вашем опыте. –

+0

Я просто помещаю его туда для простоты. Мои вопросы не касаются многопоточности, поэтому я ее и не заметил. В любом случае, я действительно отмечал ответ полезным, но по какой-то причине он не отражался на странице. И я оставил свои выводы в разделе комментариев для дальнейшего использования. – Raytrace

ответ

1

Я не уверен, что такое точка HTTPHandler, но все протоколирование может быть выполнено из HTTPModule. Однако ваш код нуждается в существенном улучшении, чтобы выжить.

1) Вы должны попробовать/блокировать блоки вокруг потоковедов, чтобы избежать необработанных исключений, особенно если вы пытаетесь быть ненавязчивыми.

2) Код streamwriter должен быть обернут в блок использования, чтобы гарантировать, что вы не берете ресурсы.

3) Поскольку вы можете потенциально иметь несколько потоков, пытающихся одновременно записать в файл, вам необходимо обернуть код записи в блок блокировки.

4) Вы можете использовать HttpContext.Current.Request для доступа к текущему запросу, который, как я подозреваю, может быть тем, что вы сделали в HttpModule. Если это не было намерение, нам потребуются дополнительные разъяснения.

5) Если вы запустите приложение в режиме отладки, а метод Init не попал, то ваши записи в web.config неверны. Тип должен быть полным (т.е. включать пространство имен), и вы должны добавить как интегрированный и режим класса конфигурации:

Классический режим (IIS 6, IIS 7+ классический)

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

Интегрированный режим (IIS 7+ интегрированный)

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

Вот переписан код:

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

Благодарим вас за ответ, однако он не касается моей потребности в том, чтобы исходное сообщение регистрировалось и пересылалось вызывающему клиенту. Возможно ли это вообще с HttpModule и/или HttpHandler? – Raytrace

+0

@Raytrace: Да, это абсолютно можно сделать, используя 'HttpContext.Current.Response.Write'.Извините, я пропустил это в оригинальном httpmodule. Я обновил ответ, чтобы это было сделано в «ContextEndRequest» и как таковое, оно появляется в нижней части страницы. –

+0

Нашли свой ответ здесь для справки в будущем: http://forums.asp.net/post/2417324.aspx – Raytrace

Смежные вопросы