1. 程式人生 > >記那些年在asp.net mvc上挖過的坑

記那些年在asp.net mvc上挖過的坑

com strong 註冊 分析 導致 技術分享 思路 命名空間 每次

表現:

IDE是vs2017。是在 A 控制器方法斷點後,卻怎麽也運行不到那個位置,但是又正常返回頁面。該方法位於web項目引用的控制器類庫上的一個控制器,試過它隔壁的控制器,一切正常。

但每次訪問該方法,codelens都會有一次記錄,如下:

技術分享圖片

嘗試解決:

首先找了web項目,看看有沒有那個名叫 A 的控制器,控制器數量不多,看了一眼,結果是沒有,也沒一個個點開看裏面內容。接著覺得是bin文件裏面會不會混入其它類庫包含有名叫 A 的控制器,於是清理了一遍解決方案重新生成,結果還是不行。

然後想到把方法名改成Index1試試:

技術分享圖片

還是不行。最後,拍了下腦袋想起來可以用反匯編工具看看控制器類庫 Index 有沒有改成 Index1 ,結果是改了;再抱著試試的心態看了下web項目控制器,bingo!A控制器就在裏面,瞬間明白是怎麽回事。A 控制器出現在web項目名叫 AllController 的控制器裏面,這是之前加的忘了刪除,導致引用的進來的 A 控制器被覆蓋了。刪掉即可。

總結:

出現這種問題,卻沒有做好分析立馬解決,是自己缺乏經驗。這個坑所表現出來的各個知識點都懂,就是缺少一個解決問題的分析思路。首先本地調試不會像遠程調試一樣出現無法加載符號或者符號版本不一致的情況,也就是無法斷點的情況;其次該方法是可以正常訪問的,也就是沒有出錯,沒有被攔截;然後奇怪的一點是codelens記錄有訪問次數,但狀態卻是紅叉,這個迷惑性比較大,讓人更加肯定斷點沒有錯,因為每次訪問這個記錄數都會加一。如果拋開這點不看,調試狀態中 一個方法訪問正常,但是沒有在斷點位置停止,那就說明斷點的這個位置不是代碼經過的位置,這時候只需要繼續找其他位置斷點,直到斷點成功。在這裏的情況是web項目裏面有同名的控制器覆蓋了引用的類庫的控制器,所以測試 A 控制器隔壁的控制器是正常的,也正因為覆蓋了 A 控制器,codelens 的記錄是紅叉。通過在路由設置命名空間即可實現一個web項目共存兩個同名控制器,按照註冊順序查找返回路由。

記那些年在asp.net mvc上挖過的坑