首页 / 网页编程 / ASP.NET / 使用IronPython检测ASP.NET程序状况(下)
        
            使用IronPython检测ASP.NET程序状况(下)2011-09-15 博客园 Jeffrey Zhao在上一篇文章中,我们在一个请求中执行了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();
}