处理函数(存疑,求证)。对此我们只 能进行让步。不过,既然ASP.NET允许HttpModule监听管道事件,那么我们不如事先准备一个HttpModule 监听各种事件,并且在合适的时候把这一事件转发给IronPython函数。我们这里还是以BeginRequest事件 为例:
public class IronPythonTraceModule : IHttpModule
{
private class TraceRequestEventArgs : EventArgs
{
public TraceRequestEventArgs (HttpContext context)
{
this.HttpContext = context;
}
public HttpContext HttpContext { get; private set; }
}
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler (OnBeginRequest);
}
static void OnBeginRequest(object sender, EventArgs e)
{
var traceRequest = IronPythonTraceModule.TraceRequest;
if (traceRequest != null)
{
var context = (sender as HttpApplication).Context;
traceRequest(null, new TraceRequestEventArgs(context));
}
}
private static event EventHandler<TraceRequestEventArgs> TraceRequest;
public static void TraceRequests(
Action<HttpContext> traceRequest,
Action endTraceRequests,
int milliseconds)
{
EventHandler<TraceRequestEventArgs> handler = (sender, e) =>
{
try
{
traceRequest(e.HttpContext);
}
catch { }
};
IronPythonTraceModule.TraceRequest += handler;
Thread.Sleep(milliseconds);
IronPythonTraceModule.TraceRequest -= handler;
if (endTraceRequests != null) endTraceRequests();
}
}
IronPythonTraceModule需要放入应用程序中,它时刻对请求管道的BeginRequest进行监听,只是在合 适的时候才会发起TraceRequest静态事件(显然这并不会对系统性能造成什么影响)。Module包函一个静 态的TraceRequests方法,这便是给外部调用的接口。可以发现这段代码和之前的TraceRequests方法非常 接近,唯一不同的只是动态添加/删除处理函数的事件是IronPythonTraceModule.TraceRequest,而不是 HttpApplication.BeginRequest。于是,原来的代码也需要做一定修改:
protected void btnExecute_Click(object sender, EventArgs e)
{
...
Action<HttpContext> traceRequest;
if (scope.TryGetVariable<Action<HttpContext>>("traceRequest", out traceRequest))
{
Action endTraceRequests;
scope.TryGetVariable<Action>("endTraceRequests", out endTraceRequests);
int waitTime;
if (!scope.TryGetVariable<int>("waitTime", out waitTime))
{
waitTime = 10000;
}
// 以下代码有所修改
IronPythonTraceModule.TraceRequests(traceRequest, endTraceRequests, waitTime);
}
this.txtOutput.Text = writer.ToString ();
}
现在我们进行一番测试,简单地检测一下5秒钟内收到 了多少请求:

使用自己的Module进行处理还有其他一些好处,比如可 |