快速业务通道

使用IronPython检测ASP.NET程序状况(下)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
处理函数(存疑,求证)。对此我们只 能进行让步。不过,既然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进行处理还有其他一些好处,比如可

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号