Hello World
Spiga

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

2007-02-06 07:23 by 老赵, 6718 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源码,我会尽快解决这个问题。

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

44 条回复

  1. 老赵
    admin
    链接

    老赵 2007-02-06 07:27:00

    居然睡不着……

  2. 老阿伯[未注册用户]
    *.*.*.*
    链接

    老阿伯[未注册用户] 2007-02-06 07:56:00

    完蛋了,老大你这样没天没夜的干活不行啊

  3. 有点麻烦[未注册用户]
    *.*.*.*
    链接

    有点麻烦[未注册用户] 2007-02-06 08:08:00

    好!!!
    老大.要注意休息啊...

  4. lovestar
    *.*.*.*
    链接

    lovestar 2007-02-06 08:46:00

    身体是革命的本钱!!! :)
    **

  5. THIN
    *.*.*.*
    链接

    THIN 2007-02-06 08:46:00

    有没有问过MS,小心版权纠纷

  6. 臭石头
    *.*.*.*
    链接

    臭石头 2007-02-06 08:46:00

    针对上面的注意事项的第二点,可不可以这样:在vs2005中,编译时,资源文件名称前面会自动加上默认命名空间,而在工程属性中又不能删除默认命名空间,你可以用记事本打开工程文件,删除默认命名空间,这样,编译的时候,资源文件名称前面就不会加上那个东东了。

    看起来,要能调试进去,还是相当麻烦的。我这里有一个想法,不知道是否合理。用你改好的工程,编译后,替换GAC里面那个。呵呵,我想也应该是不可以的,要不,早有人做了,但也说不准有人能用一些技巧达到这个目的。要是能这样,可就是最好的方案了,被调试工程都不用修改呀。

  7. 浪子
    *.*.*.*
    链接

    浪子 2007-02-06 08:48:00

    @Jeffrey Zhao
    兴奋过度阿

  8. JesseZhao
    *.*.*.*
    链接

    JesseZhao 2007-02-06 09:16:00

    @Jeffrey Zhao
    真能熬夜,现在还没睡,不知道你能不能顶住

  9. 老赵
    admin
    链接

    老赵 2007-02-06 09:39:00

    没事,是醒了,然后又睡了,呵呵。

  10. 老赵
    admin
    链接

    老赵 2007-02-06 09:40:00

    @浪子
    不兴奋阿……

  11. 老赵
    admin
    链接

    老赵 2007-02-06 09:40:00

    @THIN
    想过这个问题,看了MS-RL,应该没事,呵呵。

  12. 老赵
    admin
    链接

    老赵 2007-02-06 09:41:00

    @JesseZhao
    又去睡了一会儿:)

  13. 木野狐
    *.*.*.*
    链接

    木野狐 2007-02-06 09:41:00

    很好的参考,谢谢了。不睡觉和我几年前一样。现在我撑不住了。

  14. 老赵
    admin
    链接

    老赵 2007-02-06 09:51:00

    @木野狐
    说了我只是醒了又睡了……:)

  15. 老赵
    admin
    链接

    老赵 2007-02-06 09:52:00

    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. Axel[未注册用户]
    *.*.*.*
    链接

    Axel[未注册用户] 2007-02-06 10:37:00

    觉睡少了,饮食要注意。

  17. 老赵
    admin
    链接

    老赵 2007-02-06 10:43:00

    @Axel
    谢谢。:)

  18. 巫云
    *.*.*.*
    链接

    巫云 2007-02-06 13:07:00

    老大,为什么我总出错误,说名称空间不能转换?我已经删除了原来的引用了.

  19. 老赵
    admin
    链接

    老赵 2007-02-06 13:22:00

    @巫云
    能不能把具体的错误信息给我看一下呢?

  20. 巫云
    *.*.*.*
    链接

    巫云 2007-02-06 13:29:00

    无法将"System.Web.UI.UpdatePanel"的对象强制转换为类型"System.Web.UI.UpdatePanel"

  21. 老赵
    admin
    链接

    老赵 2007-02-06 13:31:00

    @巫云
    您需要把所有Project中的GAC引用都去掉,替换成调试用的工程,再重新编译。您现在的问题是GAC里的UpdatePanel和调试工程里的UpdatePanel无法转换。

  22. 巫云
    *.*.*.*
    链接

    巫云 2007-02-06 13:34:00

    @Jeffrey Zhao
    老大,所有工程里的都去掉??在哪里能去?我只是建了一个Ajax Enabled Site然后添加了你的工程的引用,并且去掉了原来的引用. 不知道全局缓存里的从哪去掉

  23. 老赵
    admin
    链接

    老赵 2007-02-06 13:37:00

    @巫云
    您是如何去掉的呢?
    您在Solution Explorer中右键点击WebSite,然后选择Property Pages,然后在References里看看引用了哪些,比较直观。

  24. 巫云
    *.*.*.*
    链接

    巫云 2007-02-06 13:45:00

    @Jeffrey Zhao
    我是那样干的, 控件的hint也是新添加的dll的, 都对啊, 不知道是不是别的什么地方还引用了GAC的?

  25. 老赵
    admin
    链接

    老赵 2007-02-06 13:53:00

    @巫云
    应该是这样的。能否告诉我,是哪句代码出了问题呢?

  26. 巫云
    *.*.*.*
    链接

    巫云 2007-02-06 13:55:00

    @Jeffrey Zhao
    还没写代码呢, 就拖了个UpdatePanel放在空页面上.

  27. 老赵
    admin
    链接

    老赵 2007-02-06 13:59:00

    @巫云
    编译出问题的是哪句代码呢?

  28. 巫云
    *.*.*.*
    链接

    巫云 2007-02-06 14:03:00

    @Jeffrey Zhao
    啊, 我发现了, 我把scriptmanager放到updatepanel下面了, 改成放上面就没问题了, 耽误老大休息,真是不好意思啊.
    可是控件在设计期的时候还是有错误, 会出现"呈现控件出错", 运行没错误了.

  29. 老赵
    admin
    链接

    老赵 2007-02-06 14:14:00

    @巫云
    设计期出错的问题我以后再解决。:)

  30. Leem
    *.*.*.*
    链接

    Leem 2007-02-07 00:18:00

    精力还真是旺盛,也许这是一种习惯吧.醒醒睡睡,睡睡醒醒,这样还会有睡眠质量吗?

  31. 老赵
    admin
    链接

    老赵 2007-02-07 01:00:00

    @Leem
    偶尔。:)

  32. RightWay Li
    *.*.*.*
    链接

    RightWay Li 2007-02-07 15:08:00

    没有.Design的源代码,还是不能支持设计时,这个也比较麻烦。不过用你的这个工程重新编译一份System.Web.Extensions和AjaxToolkit,可以解决在虚拟主机不能使用ASP.NET Ajax的问题。期待你把System.Web.Extensions.Design也反编译出来,呵呵

  33. 老赵
    admin
    链接

    老赵 2007-02-07 15:36:00

    @RightWay Li
    Design工程其实只是为了设计,因为我几乎不用设计期支持,所以没有管它。:)
    还有,其实虚拟主机本就可以用ASP.NET AJAX啊,把强签名的程序集复制到Bin目录下就可以了。

  34. RightWay Li
    *.*.*.*
    链接

    RightWay Li 2007-02-08 09:08:00

    @Jeffrey Zhao
    我已经试过了,可能是因为虚拟主机的trustLevel不是设置为Full,所以没法使用,总是报无法加载程序集。不知道你是不是有其他的解决方法?

  35. Sam[未注册用户]
    *.*.*.*
    链接

    Sam[未注册用户] 2007-02-08 10:00:00

    通过web、wap管理手机通讯录;
    · 通讯录信息的同步备份、格式转换管理;
    · 整合管理手机增值业务;
    · 熟悉短信、wap、彩信等业务;熟悉相关的计费规则与实现;
    · 熟悉xml,webservice,精通dotnet ASP.net C#编程,精通xhtml,AJax,WAP编程;
    · 精通UML与数据库设计;
    · 专兼职都可,已完成项目为准;
    请发送邮件到 shinestone@sina.com

  36. 魏晋遗疯
    *.*.*.*
    链接

    魏晋遗疯 2007-02-09 15:52:00

    有了老赵和各位大虾,咱们的Ajax技术一点不会比老外差!

  37. 老赵
    admin
    链接

    老赵 2007-02-09 16:17:00

    @魏晋遗疯
    过奖,这是我的目标。:)

  38. LZL[未注册用户]
    *.*.*.*
    链接

    LZL[未注册用户] 2007-03-09 10:57:00

    大家好,我是新手,我想问个问题。我把asp.net ajax 1.0下了,安装在电脑上了,然后打开了ajax项目运行正常,但是我打开website项目,把ScriptManager添加到页面上开始运行就出SYS未定义错误,网上说是web.cfg配置问题,我就根据网上说的配置了,但是打开页面的时候还是出SYS错误。哎,心里难受啊,希望各位帮我解决一下,先谢谢了。

  39. LZLX[未注册用户]
    *.*.*.*
    链接

    LZLX[未注册用户] 2007-03-11 13:28:00

    asp.net ajax 1.0正式版发布了吧,以后不会有什么大的更新了吧,我可以重头开始学习这个了吧?

  40. 老赵
    admin
    链接

    老赵 2007-03-11 16:35:00

    @LZLX
    正式版了就不会变了,呵呵。

  41. 齐凡[未注册用户]
    *.*.*.*
    链接

    齐凡[未注册用户] 2007-09-10 13:37:00

    老赵,太牛了,我搞了个项目用了微软的ajax,本机上能行,但在网上租的空间就不行了,因为人家不给装插件,多亏你老救命了

  42. lojxg
    *.*.*.*
    链接

    lojxg 2007-09-13 11:06:00

    很好,下载了!

  43. laolaowhn
    *.*.*.*
    链接

    laolaowhn 2008-07-08 16:52:00

    大哥都不知道如何谢你了,调试的我非常郁闷的事情都被你解决了,没啥说的?

  44. laolaowhn
    *.*.*.*
    链接

    laolaowhn 2008-07-09 10:26:00

    @Jeffrey Zhao
    错误 89 程序集生成失败 -- 引用的程序集“System.Web.Extensions”没有强名称 AjaxControlToolkit
    这个问题如何解决

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我