鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 424, 文章 - 231, 评论 - 5410, 引用 - 344
数据加载中……

在Apache上调试Asp.net 1.1/2.0代码

    我们知道ASP.NET 1.1的项目由于微软设计和实现的原因,对IIS的依赖非常的紧密。不管是创建ASP.NET项目,还是打开、调试ASP.NET项目,都要求IIS运行正常,否则什么都做不成。那么当我们在Apache上运行ASP.NET后,可不可以对其进行源代码级的step into/out调试呢?

    由于Apache2项目中的mod_aspdotnet sub-project实现上的问题(也可以说是bug吧),使我们在其上运行ASP.NET程序时,和在IIS上的aspnet_wp|w3wp中运行的正确性上有一些差别,所以在Apache(mod_aspdotnet)上调试ASP.NET项目的源代码就很有必要。虽然ASP.NET 2.0已经正式release,不过1.1版本的项目还是目前的主流,所以我们分别看看Apache对这两个版本Framework的支持。正如我前面所说,ASP.NET 1.1的项目紧密地依赖IIS,所以目前我只能在Apache上调试已有的ASP.NET 1.1项目,而不能创建(原因后面再说)。由于IIS先安装并占用了80端口,所以我的Apache Web Server就只能运行在其它端口上了(如:8080,通过httpd.conf文件配置)。

    首先,我们需要让这个被调试的项目在IIS上运行正确,并且项目可以被VS.NET 2003 IDE正确开启。然后配置Apache,让这个项目同时在Apache上也运行正确。我们就可以通过IDE的Ctrl+Alt+P来Attach希望被debug的进程,这时我们会看到在任务列表(需要check "Show system processes")里居然有两个Apache.exe进程。这里我也不知道应该是哪个,虽然它们的类型都是".NET, Win32",不过只有一个是mod_aspdotnet的宿主进程。当然我们还是可以用个小trick来判断,就是打开taskmgr并刷新Apache上运行的Web站点的页面,看那个Apache.exe进程占用CPU,那么它就是asp.net支持模块的宿主。Attach成功后就可以在VS.NET里面设置断点,进行step into/out的源代码级调试了。

    上面是对ASP.NET 1.1项目的调试方法,如果是ASP.NET 2.0的项目呢?由于.NET Framework及Visual Studio 2005的改进,调试2.0的ASP.NET项目变得奇easy! 只需要把项目在Apache上运行好后,用Visual Studio 2005打开希望调试的页面的源代码(*.cs)文件,Attach上Apache的进程后直接设置断点就可以了,根本不需要开启项目,当然也就和IIS完全脱离关系了

    AvailableProcesses.png
    // 不管是1.1还是2.0,都需要确定到底是哪个Apache.exe进程是宿主

    在Apache上调试失败的已知可能问题:
    1、没有使用debug版的项目dll来运行,这个。。。还是问题吗
    2、第二种情况,如果不注意,可能会认为是Apache不能调试1.1的Asp.net。就是如果机器上同时装了Fx1.1和Fx2.0,mod_aspdotnet会默认把我们的ASP.NET程序加载在Fx2.0上运行,这时如果用VS.NET 2003去调试将无法Attach任何Apache.exe进程。当然用Visual Studio 2005是可以的。解决办法需要在httpd.conf中使用"AspNetVersion v1.1.4322"命令显示指定Asp.net程序运行时的.NET Framework版本。

    前面我提到了1.1版本的Asp.net项目的建立必须要IIS,这是因为在创建项目时VS.NET 2003需要向IIS获取目前其支持的Asp.net的版本信息,然后通过一些Get和Post操作,创建一些项目必须文件在服务器上,具体步骤如下: 
Created ASP.NET Project by VS.NET 2003 Command

    同样在ASP.NET 2.0中,这个步骤完全不需要了,ASP.NET项目就是一个目录,完全的和Web Server脱离开了。我们也就再也不用因为IIS的捣乱,而使的不能开发ASP.NET程序了~~~

posted on 2006-01-12 00:48 birdshome 阅读(3390) 评论(8)  编辑 收藏 所属分类: .NET技术开发相关

评论

#1楼    回复  引用  查看    

响应速度有更快么?
2006-01-12 09:20 | 深渊野鱼      

#2楼 [楼主]   回复  引用  查看    

@深渊野鱼
什么响应速度?Apache Web Server 的请求响应速度?!
2006-01-12 10:04 | birdshome      

#3楼    回复  引用  查看    

大家可以试试cassini
2006-01-12 10:24 | idior      

#4楼    回复  引用  查看    

是啊,我想知道是不是asp.net在apache web server的请求响应速度比iis来得快~~
2006-01-12 11:21 | 深渊野鱼      

#5楼 [楼主]   回复  引用  查看    

@idior
cassini是什么好东东?!

@深渊野鱼
目前研究apache方案主要不是为了效率,原因在我的这篇文章里有说道:http://birdshome.cnblogs.com/archive/2005/11/17/Apache.html
至于apache和iis的强弱,可以看别人的测试,不过如果在IIS6上面,w3wp的效率应该高于mod_aspdotnet。因为前者使用named pipe进行进程间通信,而后者是COM组件间调用。
2006-01-12 11:27 | birdshome      

#6楼    回复  引用  查看    

就是一个很轻量级的web server, 最适合那种没有或者无法使用(xp home)iis的用户,做asp.net的开发.
2006-01-12 12:30 | idior      

#7楼    回复  引用  查看    

Cassini是VS2005自带的.当你写Web程序的时候,默认使用就是Cassini
2006-01-20 14:26 | XiaoHui      

#8楼    回复  引用    

在APACHE下跑ASP。NET程序时,若有《%=xxx%》标签就会出错,页面没有完全传回,这是怎么回事呢?在WIN2003下不会出,但XP下会出错
2006-06-19 10:53 | 菜鸟999 [未注册用户]

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-02-07 19:36 编辑过


相关链接:

历史上的今天:
2005-01-12 使用混合脚本编程来实现的Base64编码