雞肋烹制出的美味——真正可調試的ASP.NET AJAX

來源:互聯網
上載者:User
URL:http://www.cnblogs.com/JeffreyZhao/archive/2007/02/06/ASP_NET_AJAX_Debugging_Project.html

雞肋般的源碼

  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源碼,我會儘快解決這個問題。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.