热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

在ASP.NET应用程序运行过程中,很可能会遇到各种意料之外的问题。如果在开发环境下,我们可以设置断点,对程序状态一探究竟。但是很显然&#

在ASP.NET应用程序运行过程中,很可能会遇到各种意料之外的问题。如果在开发环境下,我们可以设置断点,对程序状态一探究竟。但是很显然,在产品环境中我们几乎无法使用这样的状态。也正因为如此,Dump一个内存快照并进行分析才成为一种“高级技术”,同时在线调试也成为一种需要结合技术能力、分析能力,甚至抗压能力的工作。对于调试和解决问题的探索永远不会停止,各成熟的技术团队几乎都会有一个丰富工具箱,用于应付生产环境中的各种状况。

在维护一些生产环境中的ASP.NET应用程序时,老赵也经常会感到“力不从心”。虽然我们可以建立丰富有效的监控或日志等维护机制,但是调试和分析一次程序经常需要耗费大量的脑细胞。因为我们可以使用的工具大都非常抽象,即使是一个非常微小的问题,也要用较多的时间才能发现“哦,原来是这个变量的值进入了一种奇怪的状态”。如果我们有一种机制,可以直观地检查生产环境中正在运行的程序的状态,那么一定可以大大方便我们的工作。

这篇文章记录的便是老赵的一次探索。

我们的目的是“在程序运行过程中记录状态”。使用ASP.NET的传统机制,例如HttpModule,Trace,往往需要修改配置和部署新的程序集,这样一不小心便会造成应用程序的重启。对于访问量数据量到了一定规模的时候,冷启动的消耗也是相当可观的,不断地冷启动会对应用程序造成非常大的影响。可能我们希望的,只是能够简单地(在不影响现有系统的情况下)执行一段代码,并输出一些内容。要实现这点其实并不难,例如最直接的做法便是提交一段代码,保存成文件,调用CSC将其编译成dll,然后在程序中进行加载。这已经不是一种新鲜的技巧了,它已经用在很多地方,得到了一些不错的效果。

但是,老赵在这里还是想使用IronPython,一个原因是老赵最近也在尝试合理地混用各种语言(F#, IronPython, IronRuby, etc.)编写应用程序以提高生产力,便“顺便”地用上了IronPython的现有成果。IronPython已经内置了Python代码的执行引擎,并且能与.NET程序无缝集成。此外,社区中也已经接受了如Crack.NET等基于IronPython的调试工具1,表明IronPython已经足够成熟,可以放心使用。关于更多IronPython的信息,可以参考在QCon London 20092中,《IronPython in Action》一书的作者Michael Foord的演讲“Real World IronPython”。

在这里,我们先准备一个简单的aspx页面,其中有两个文本框,以及一个按钮:

<asp:TextBox ID&#61;"txtCode" runat&#61;"server" Height&#61;"320px" TextMode&#61;"MultiLine" Width&#61;"640px">asp:TextBox>
<
br />
<
asp:Button ID&#61;"btnExecute" runat&#61;"server" onclick&#61;"btnExecute_Click" Text&#61;"Execute" />
<
br />
<
asp:TextBox ID&#61;"txtOutput" runat&#61;"server" Height&#61;"320px" TextMode&#61;"MultiLine"Width&#61;"640px">asp:TextBox>

这里&#xff0c;我们希望在点击按钮之后&#xff0c;可以执行txtCode中的IronPython代码&#xff0c;并且将信息显示在txtOutput中&#xff1a;

protected void btnExecute_Click(object sender, EventArgs e)
{ScriptEngine engine &#61; Python.CreateEngine();var scope &#61; engine.CreateScope();var script &#61; engine.CreateScriptSourceFromString(this.txtCode.Text, SourceCodeKind.Statements);script.Execute(scope);TextWriter writer &#61; new StringWriter();scope.SetVariable("logger", writer);Action<HttpContext> trace;if (scope.TryGetVariable<Action<HttpContext>>("trace", out trace)){trace(this.Context);}this.txtOutput.Text &#61; writer.ToString();
}

如果您要使用上面的代码&#xff0c;则需要引用IronPython、Microsoft.Scripting及Microsoft.Scripting.Core三个程序集。您可能没有接触过这部分内容&#xff0c;但是应该也能够轻易理解上述代码的含义&#xff1a;

  1. 创建一个ScriptEngine对象&#xff0c;并得到一个ScriptScope。
  2. 将txtCode文本框内的代码&#xff0c;作为Statements编译为ScriptSource对象。
  3. 创建一个StringWriter对象&#xff0c;并赋给ScriptScope中的logger变量。
  4. 执行ScriptSource&#xff0c;并从中获取trace方法成为一个委托。
  5. 将当前HttpContext传入trace方法执行&#xff0c;并输出内容。

于是我们准备一段IronPython代码&#xff0c;它的作用是输出当前请求的UserAgent&#xff0c;如下图&#xff1a;

29175212_EvMr.jpg

只是这么一个简单的功能&#xff0c;我们便可以做很多事情&#xff0c;例如使用反射改变某个对象的状态&#xff0c;甚至调用系统中某个方法进行复杂的工作。不过在实际使用时我们可能还需要额外的注意&#xff1a;由于我们基于单个“请求”&#xff0c;因此只能有一台机器得以动态执行IronPython代码。如果在产品环境中只有一台机器&#xff0c;那么自当无事&#xff0c;否则我们就可能需要某种手段来确保我们的代码是在哪台服务器上执行的。例如&#xff0c;对于DNS轮询方式的附载均衡策略&#xff0c;您只需修改本机DNS即可&#xff0c;否则您可能就需要根据您的NLB策略进行其它一些配置。更进一步&#xff0c;如果您需要代码在所有机器上执行&#xff0c;可能就需要编写一个远程调用平台&#xff0c;可以将代码发送到所有机器上执行&#xff0c;并将结果进行聚合。

在下一篇文章中&#xff0c;我们将使用类似的做法&#xff0c;对系统中的请求进行采样&#xff0c;以获取更加丰富的数据——那是一件更有意思的事情.

 

注1&#xff1a;Crack.NET是用于分析WinForm和WPF应用程序状态的工具&#xff0c;可能是由于CLR托管方式的不同&#xff0c;它无法用于ASP.NET或SQL Server等托管程序上。

注2&#xff1a;&#xff08;广告时间&#xff09;QCon北京是中国举办的第一次QCon大会&#xff0c;业界各顶尖专家齐聚一堂&#xff0c;如果哪位朋友或所在公司感兴趣&#xff0c;请和老赵联系。

 

相关文章&#xff1a;使用IronPython检测ASP.NET程序状况&#xff08;下&#xff09;

转:https://my.oschina.net/abcijkxyz/blog/721671



推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 1、PLSQLDeveloper记住登陆密码在使用PLSQLDeveloper时,为了工作方便希望PLSQLDeveloper记住登录Oracle的用户名和密码&#x ... [详细]
  • Java_脚本引擎_01_用法入门
    java,脚本,引 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • NetBPM的安装还是比较简单的,有比较详细的文档。1.当然是先下载运行程序了,netbpm-0.8.3.1.zip,官方网站ÿ ... [详细]
  • VNPY  软件架构分析
    VNPY架构设计文档版本日志:一.引言编写目的:该软件概要设计说明书是“VNPY”开发中的重要文献资料,所完成的工作是将需求说明书中的数据流图转化成软件结构和数据结构,为后续进行详 ... [详细]
author-avatar
mobiledu2502877091
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有