表现:

IDE是vs2017。是在 A 控制器方法断点后,却怎么也运行不到那个位置,但是又正常返回页面。该方法位于web项目引用的控制器类库上的一个控制器,试过它隔壁的控制器,一切正常。

但每次访问该方法,codelens都会有一次记录,如下:

记那些年在asp.net mvc上挖过的坑-LMLPHP

尝试解决:

首先找了web项目,看看有没有那个名叫 A 的控制器,控制器数量不多,看了一眼,结果是没有,也没一个个点开看里面内容。接着觉得是bin文件里面会不会混入其它类库包含有名叫 A 的控制器,于是清理了一遍解决方案重新生成,结果还是不行。

然后想到把方法名改成Index1试试:

记那些年在asp.net mvc上挖过的坑-LMLPHP

还是不行。最后,拍了下脑袋想起来可以用反汇编工具看看控制器类库 Index 有没有改成 Index1 ,结果是改了;再抱着试试的心态看了下web项目控制器,bingo!A控制器就在里面,瞬间明白是怎么回事。A 控制器出现在web项目名叫 AllController 的控制器里面,这是之前加的忘了删除,导致引用的进来的 A 控制器被覆盖了。删掉即可。

总结:

出现这种问题,却没有做好分析立马解决,是自己缺乏经验。这个坑所表现出来的各个知识点都懂,就是缺少一个解决问题的分析思路。首先本地调试不会像远程调试一样出现无法加载符号或者符号版本不一致的情况,也就是无法断点的情况;其次该方法是可以正常访问的,也就是没有出错,没有被拦截;然后奇怪的一点是codelens记录有访问次数,但状态却是红叉,这个迷惑性比较大,让人更加肯定断点没有错,因为每次访问这个记录数都会加一。如果抛开这点不看,调试状态中 一个方法访问正常,但是没有在断点位置停止,那就说明断点的这个位置不是代码经过的位置,这时候只需要继续找其他位置断点,直到断点成功。在这里的情况是web项目里面有同名的控制器覆盖了引用的类库的控制器,所以测试 A 控制器隔壁的控制器是正常的,也正因为覆盖了 A 控制器,codelens 的记录是红叉。通过在路由设置命名空间即可实现一个web项目共存两个同名控制器,按照注册顺序查找返回路由。

05-10 19:16