IHttpModule проблемы - PullRequest
       31

IHttpModule проблемы

0 голосов
/ 02 января 2012

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

  1. Исходное сообщение потеряно
  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();
        }
    }
}

Мой предыдущийpost: IIS API Monitor в веб-приложении Заранее спасибо!

1 Ответ

1 голос
/ 02 января 2012

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

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

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

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

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

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

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

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