快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

在上一篇文章中,我们在一个请求中执行了IronPython代码,通过这个方法我们可以轻松地的检查系 统运行的状态,或对系统进行一些简单修改。但是这种做法只能检查系统在当前时刻的状态,在很多情况 下,我们需要对系统的请求进行一段时间的采样。对于简单的数据(例如每秒执行的请求数量,请求时间 ),我们可以通过查看Performance Monitor中相关的计数器来获得一些概要的数据。但是,如果我们需 要获取一些系统的详细状态,甚至是需要根据需要进行动态改变的自定义需求,则势必要深入到系统内部 进行数据采集。因此,我们可能需要让代码执行“一段时间”,并将直接结果进行汇总输出。

让代码执行一段时间不难,简单地使用Thread.Sleep便可,也不会造成什么性能或吞吐量上的损失。 关键就在于,在代码停留的这“一段时间”内,我们使用什么样的做法来采集数据。这时候,老赵脑海中 立即浮现出的便是HttpModule般监听请求管道(Pipeline)中的各式事件。于是立马写出以下的代码(在 前文的示例基础上进行修改):

protected void btnExecute_Click(object sender, EventArgs e)
{
   ScriptEngine engine = Python.CreateEngine();
  var scope = engine.CreateScope ();
  var script = engine.CreateScriptSourceFromString(
     this.txtCode.Text, SourceCodeKind.Statements);
  script.Execute(scope);

   TextWriter writer = new StringWriter();
  scope.SetVariable("logger",  writer);

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

     this.TraceRequests(traceRequest, waitTime, endTraceRequests);
  }

   this.txtOutput.Text = writer.ToString();
}

private void TraceRequests (Action<HttpContext> traceRequest, int waitTime, Action endTraceRequests)
{
  EventHandler handler = (sender, e) =>
  {
    try
     {
      traceRequest((sender as HttpApplication).Context);
    }
     catch { }
  };

  this.Context.ApplicationInstance.BeginRequest +=  handler;
  Thread.Sleep(waitTime);
  this.Context.ApplicationInstance.BeginRequest  -= handler;

  if (endTraceRequests != null) endTraceRequests();
}

再编译了IronPython代码之后,我们会设法获取其中的traceRequest和endTraceRequests函数,前者 用于“记录每个请求”,而后者用于采样最后的“聚合”。此外,还会设法从代码中获取等待时间 waitTime。然后,使用TraceRequest方法开始对当前请求进行采样。具体做法为监听当前Application的 BeginRequest事件,并在每次获得请求时调用traceRequest委托进行“记录”。在等待时间过后,自然将 委托从BeginRequest事件中剥离。最后,再通过endTraceRequests函数进行聚合输出。

代码逻辑很清晰,但可惜的是,上面这段代码不能生效。具体原因不明,可能是ASP.NET对这方面进行 了限制,使得我们无法在HttpModule之外为请求管道动态添加事件

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号