IHttpModule проблемы
Я задал вопрос о создании регистратора IIS, но у меня все еще есть несколько проблем:
- Исходное сообщение потеряно
- Ответное сообщение не фиксируется
Будет ли вообще возможно разобраться с этими двумя?
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 в веб-приложении Заранее спасибо!
1 ответ
Я не уверен, в чем смысл 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
{
}
}