Spiga

鸡肋烹制出的美味——真正可调试的ASP.NET AJAX

2007-02-06 07:23 by Jeffrey Zhao, 5228 visits, 网摘, 编辑

鸡肋般的源码

  ASP.NET AJAX的源代码的确发布了,并且提供了pdb文件,也就是说,我们现在可以用它来调试了。

  但是它真的够用吗?不知道各位朋友们有没有真的用它跟踪到代码中去,至少我用下来之后非常的不满意。

  • 代码分散在每个文件中,IDE的Go to Definition等功能无法使用。
  • 代码文件不能有丝毫修改,否则pdb里面记录的行号就无法与源代码对应。
  • 在调试时查看对象的属性或成员时,经常会遇到如下的提示:“Cannot evaluate expression because the code of the current method is optimized.”,而无法查看属性或成员地值。

  其中最后一个问题最为关键,它严重阻碍了调试过程。可是这又有什么办法呢?在编译好的程序集里MSIL都得到了优化,它已经不是元文件直接编译的结果了。

  现在的源代码真是鸡肋。

 

鸡肋也能烹制美味

  谁说鸡肋不能烹制美味?

  官方给出了源代码,我们为什么不设法把它恢复成C#工程呢?于是我新建了一个C# Class Library,把源代码复制到工程中去。然后通过比较编译错误、运行错误以及使用.NET Reflector查看ASP.NET AJAX程序集,一点点补充丢失的资源和代码,费了九牛二虎之力总算比较完美地恢复了ASP.NET AJAX的程序集。

  享用这道美食的方法也非常简单,您只需要做以下几步就可以了:

  1. 点击这里下载工程文件和Web.config文件。
  2. 将压缩包解开,将System.Web.Extensions工程引入到您的解决方案中去。
  3. 为解决方案里必要的工程添加一个刚才新增的System.Web.Exetensions工程的引用,并删除对GAC里System.Web.Extensions.dll的引用。
  4. 修改Web.config,将所有的“, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”去除,您可以对照着压缩包里的Web.config文件进行编辑,或者直接使用这个文件。
  5. 重新编译。

  现在,ASP.NET AJAX已经成为您解决方案中的一个工程了,您可以任意修改它,任意对它进行调试。当调试完毕后,去除对于这个工程的引用,并且重新添加GAC里System.Web.Extensions.dll的引用即可。

 

享受美味时的注意事项

  目前这个工程有些问题可能需要注意一下:

1、调试工程与GAC里的System.Web.Extensions.dll不能同时引用

  为了调试时不修改您的任何代码,我保留了调试工程里所有源代码不变,这导致了如果一个工程里同时引用了GAC里的System.Web.Extensions.dll和调试工程,则在编译时会出现命名空间冲突的错误。这似乎是一个无法解决的问题,不过调试工程和GAC里的程序集几乎完全一样,您也可以完全使用调试工程进行开发,发布时重新编译一次,并将Web.config改回来即可。

2、资源文件名称以及相关代码有轻微改变

  由于使用了VS进行编译(使用命令行编译可以解决这个问题,但是就不容易调试使用了),因此资源文件的名称不得不进行了改变,例如MicrosoftAjax.js改成了System.Web.MicrosoftAjax.js。相应的,由于源文件中hard-coded了这个文件名,因此我也对它进行了修改。这导致了如果您的程序需要识别这些文件名时,在使用调试工程时也需要修改一下您的代码。例如在我之前的文章《ScriptManager的ResolveScriptReference事件的重要作用》中,我会判断程序集是否引用了程序集里名为MicrosoftAjax.js的文件,现在就要判断是否引用了名为System.Web.MicrosoftAjax.js。

  另外,System.Web.UI.WebResourceUtil类的私有方法SystemWebExtensionsContainsWebResource会用来教验资源文件是否存在,我现在把它改为直接return true,将判断的逻辑短路。这段代码是为了在开发人员恶意访问System.Web.Extensions.dll程序集里不存在的资源时抛出合理的异常,我们正常使用ASP.NET AJAX时不会受到这个修改的影响。

  在几乎所有情况下,这些轻微改变都不会造成使用上的问题。

3、控件的图标没有编译进程序集

  控件的图标没有编译进入程序集,这样调试用工程里的控件,如UpdatePanel在工具栏中不会出现图标。这不会对使用有任何影响,反而可以与GAC里的UpdatePanel进行区分。

4、使用Ajax Control Toolkit时需要重新编译

  如果您需要把Ajax Control Toolkit和调试工程同时使用时,您也需要把Ajax Control Toolkit的源文件引入到您的解决方案中,并修改它的引用,使它使用我们调试用的工程。最后需要重新编译,生成新的程序集。

5、调试工程的UpdatePanel没有设计期支持

  要有设计期的支持似乎还需要配合Design源码,我会尽快解决这个问题。

Add your comment

45 条回复

  1. #1楼[楼主] Jeffrey Zhao      2007-02-06 07:27
    居然睡不着……
      回复  引用  查看    
  2. #2楼 老阿伯[未注册用户]2007-02-06 07:56
    完蛋了,老大你这样没天没夜的干活不行啊
      回复  引用    
  3. #3楼 有点麻烦[未注册用户]2007-02-06 08:08
    好!!!
    老大.要注意休息啊...
      回复  引用    
  4. #4楼 lovestar      2007-02-06 08:46
    身体是革命的本钱!!! :)
    **
      回复  引用  查看    
  5. #5楼 THIN      2007-02-06 08:46
    有没有问过MS,小心版权纠纷
      回复  引用  查看    
  6. #6楼 臭石头      2007-02-06 08:46
    针对上面的注意事项的第二点,可不可以这样:在vs2005中,编译时,资源文件名称前面会自动加上默认命名空间,而在工程属性中又不能删除默认命名空间,你可以用记事本打开工程文件,删除默认命名空间,这样,编译的时候,资源文件名称前面就不会加上那个东东了。

    看起来,要能调试进去,还是相当麻烦的。我这里有一个想法,不知道是否合理。用你改好的工程,编译后,替换GAC里面那个。呵呵,我想也应该是不可以的,要不,早有人做了,但也说不准有人能用一些技巧达到这个目的。要是能这样,可就是最好的方案了,被调试工程都不用修改呀。
      回复  引用  查看    
  7. #7楼 浪子      2007-02-06 08:48
    @Jeffrey Zhao
    兴奋过度阿
      回复  引用  查看    
  8. #8楼 JesseZhao      2007-02-06 09:16
    @Jeffrey Zhao
    真能熬夜,现在还没睡,不知道你能不能顶住
      回复  引用  查看    
  9. #9楼[楼主] Jeffrey Zhao      2007-02-06 09:39
    没事,是醒了,然后又睡了,呵呵。
      回复  引用  查看    
  10. #10楼[楼主] Jeffrey Zhao      2007-02-06 09:40
    @THIN
    想过这个问题,看了MS-RL,应该没事,呵呵。
      回复  引用  查看    
  11. #11楼[楼主] Jeffrey Zhao      2007-02-06 09:40
    @浪子
    不兴奋阿……
      回复  引用  查看    
  12. #12楼[楼主] Jeffrey Zhao      2007-02-06 09:41
    @JesseZhao
    又去睡了一会儿:)
      回复  引用  查看    
  13. #13楼 木野狐      2007-02-06 09:41
    很好的参考,谢谢了。不睡觉和我几年前一样。现在我撑不住了。
      回复  引用  查看    
  14. #14楼[楼主] Jeffrey Zhao      2007-02-06 09:51
    @木野狐
    说了我只是醒了又睡了……:)
      回复  引用  查看    
  15. #15楼[楼主] Jeffrey Zhao      2007-02-06 09:52
    ScottGu提到这个了:“I'm hoping/working to try and get the full ASP.NET framework source code published. It is a fairly lengthy process to get it approved, but we are working on trying to get it done.”
      回复  引用  查看    
  16. #16楼 Axel[未注册用户]2007-02-06 10:37
    觉睡少了,饮食要注意。
      回复  引用    
  17. #17楼[楼主] Jeffrey Zhao      2007-02-06 10:43
    @Axel
    谢谢。:)
      回复  引用  查看    
  18. #18楼 巫云      2007-02-06 13:07
    老大,为什么我总出错误,说名称空间不能转换?我已经删除了原来的引用了.
      回复  引用  查看    
  19. #19楼[楼主] Jeffrey Zhao      2007-02-06 13:22
    @巫云
    能不能把具体的错误信息给我看一下呢?
      回复  引用  查看    
  20. #20楼 巫云      2007-02-06 13:29
    无法将"System.Web.UI.UpdatePanel"的对象强制转换为类型"System.Web.UI.UpdatePanel"
      回复  引用  查看    
  21. #21楼[楼主] Jeffrey Zhao      2007-02-06 13:31
    @巫云
    您需要把所有Project中的GAC引用都去掉,替换成调试用的工程,再重新编译。您现在的问题是GAC里的UpdatePanel和调试工程里的UpdatePanel无法转换。
      回复  引用  查看    
  22. #22楼 巫云      2007-02-06 13:34
    @Jeffrey Zhao
    老大,所有工程里的都去掉??在哪里能去?我只是建了一个Ajax Enabled Site然后添加了你的工程的引用,并且去掉了原来的引用. 不知道全局缓存里的从哪去掉
      回复  引用  查看    
  23. #23楼[楼主] Jeffrey Zhao      2007-02-06 13:37
    @巫云
    您是如何去掉的呢?
    您在Solution Explorer中右键点击WebSite,然后选择Property Pages,然后在References里看看引用了哪些,比较直观。
      回复  引用  查看    
  24. #24楼 巫云      2007-02-06 13:45
    @Jeffrey Zhao
    我是那样干的, 控件的hint也是新添加的dll的, 都对啊, 不知道是不是别的什么地方还引用了GAC的?
      回复  引用  查看    
  25. #25楼[楼主] Jeffrey Zhao      2007-02-06 13:53
    @巫云
    应该是这样的。能否告诉我,是哪句代码出了问题呢?
      回复  引用  查看    
  26. #26楼 巫云      2007-02-06 13:55
    @Jeffrey Zhao
    还没写代码呢, 就拖了个UpdatePanel放在空页面上.
      回复  引用  查看    
  27. #27楼[楼主] Jeffrey Zhao      2007-02-06 13:59
    @巫云
    编译出问题的是哪句代码呢?
      回复  引用  查看    
  28. #28楼 巫云      2007-02-06 14:03
    @Jeffrey Zhao
    啊, 我发现了, 我把scriptmanager放到updatepanel下面了, 改成放上面就没问题了, 耽误老大休息,真是不好意思啊.
    可是控件在设计期的时候还是有错误, 会出现"呈现控件出错", 运行没错误了.
      回复  引用  查看    
  29. #29楼[楼主] Jeffrey Zhao      2007-02-06 14:14
    @巫云
    设计期出错的问题我以后再解决。:)
      回复  引用  查看    
  30. #30楼 Leem      2007-02-07 00:18
    精力还真是旺盛,也许这是一种习惯吧.醒醒睡睡,睡睡醒醒,这样还会有睡眠质量吗?
      回复  引用  查看    
  31. #31楼[楼主] Jeffrey Zhao      2007-02-07 01:00
    @Leem
    偶尔。:)
      回复  引用  查看    
  32. #32楼 RightWay Li      2007-02-07 15:08
    没有.Design的源代码,还是不能支持设计时,这个也比较麻烦。不过用你的这个工程重新编译一份System.Web.Extensions和AjaxToolkit,可以解决在虚拟主机不能使用ASP.NET Ajax的问题。期待你把System.Web.Extensions.Design也反编译出来,呵呵
      回复  引用  查看    
  33. #33楼[楼主] Jeffrey Zhao      2007-02-07 15:36
    @RightWay Li
    Design工程其实只是为了设计,因为我几乎不用设计期支持,所以没有管它。:)
    还有,其实虚拟主机本就可以用ASP.NET AJAX啊,把强签名的程序集复制到Bin目录下就可以了。
      回复  引用  查看    
  34. #34楼 RightWay Li      2007-02-08 09:08
    @Jeffrey Zhao
    我已经试过了,可能是因为虚拟主机的trustLevel不是设置为Full,所以没法使用,总是报无法加载程序集。不知道你是不是有其他的解决方法?
      回复  引用  查看    
  35. #35楼 Sam[未注册用户]2007-02-08 10:00
    通过web、wap管理手机通讯录;
    · 通讯录信息的同步备份、格式转换管理;
    · 整合管理手机增值业务;
    · 熟悉短信、wap、彩信等业务;熟悉相关的计费规则与实现;
    · 熟悉xml,webservice,精通dotnet ASP.net C#编程,精通xhtml,AJax,WAP编程;
    · 精通UML与数据库设计;
    · 专兼职都可,已完成项目为准;
    请发送邮件到 shinestone@sina.com
      回复  引用    
  36. #36楼 魏晋遗疯      2007-02-09 15:52
    有了老赵和各位大虾,咱们的Ajax技术一点不会比老外差!
      回复  引用  查看    
  37. #37楼[楼主] Jeffrey Zhao      2007-02-09 16:17
    @魏晋遗疯
    过奖,这是我的目标。:)
      回复  引用  查看    
  38. #38楼 LZL[未注册用户]2007-03-09 10:57
    大家好,我是新手,我想问个问题。我把asp.net ajax 1.0下了,安装在电脑上了,然后打开了ajax项目运行正常,但是我打开website项目,把ScriptManager添加到页面上开始运行就出SYS未定义错误,网上说是web.cfg配置问题,我就根据网上说的配置了,但是打开页面的时候还是出SYS错误。哎,心里难受啊,希望各位帮我解决一下,先谢谢了。
      回复  引用    
  39. #39楼 LZLX[未注册用户]2007-03-11 13:28
    asp.net ajax 1.0正式版发布了吧,以后不会有什么大的更新了吧,我可以重头开始学习这个了吧?
      回复  引用    
  40. #40楼[楼主] Jeffrey Zhao      2007-03-11 16:35
    @LZLX
    正式版了就不会变了,呵呵。
      回复  引用  查看    
  41. #41楼 齐凡[未注册用户]2007-09-10 13:37
    老赵,太牛了,我搞了个项目用了微软的ajax,本机上能行,但在网上租的空间就不行了,因为人家不给装插件,多亏你老救命了
      回复  引用    
  42. #42楼 lojxg      2007-09-13 11:06
    很好,下载了!
      回复  引用  查看    
  43. #43楼 laolaowhn      2008-07-08 16:52
    大哥都不知道如何谢你了,调试的我非常郁闷的事情都被你解决了,没啥说的?
      回复  引用  查看    
  44. #44楼 laolaowhn      2008-07-09 10:26
    @Jeffrey Zhao
    错误 89 程序集生成失败 -- 引用的程序集“System.Web.Extensions”没有强名称 AjaxControlToolkit
    这个问题如何解决
      回复  引用  查看    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 641471




相关文章:

相关链接: