上个星期,我们接手的公司线上系统的一个新模块发布好之后,我测试了一下,竟然出现了一个大BUG——获取交换机端口信息的页面得不到数据还导致整个模块用不了……页面的提示信息是“Service Unavailable”。奇怪的是之前发布到我们无锡这边的服务器上并没有出现这样的问题……还好正式版上各个模块是单独用的一个应用程序池,不然的话会导致整个线上系统用不了……
根据页面提示信息,初步判断是线上服务器和我们的服务器IIS“应用程序池”的设置不一样导致的。找服务器管理人员要到了IIS日志文件之后,没找到任何有关我们程序错误的线索……后来又要来了出错那天的系统日志文件,错误信息是“应用程序池 'XXX' 被自动禁用,原因是为此应用程序池提供服务的进程中出现一系列错误。”,“为应用程序池 'XXX' 提供服务的进程在与 World Wide Web Publishing 服务通信时遇到致命错误。”……以这些错误信息为关键字到网上找了一下资料,没找到有效地解决办法。后来排除了是IIS以及应用程序池设置的问题。
网络管理那一块用到的是CodeProject上的一个类库,这个类库同时使用了C/C++、VB、C#,综合性很强。虽然仔细看过这个类库源文件中的相关代码,但是还是不能确定是不是这个类库的问题引起的我们项目中的这个问题。(这个类库我在这篇文章中提到过:>>)。其实这个网络管理模块是我的一位女同事完成的,我是后来才进这个项目的,只是从她那了解了一下实现思路,查过相关资料。我在看她写的代码的时候有过疑问,就是这个类库的Demo是一个C/S的项目,她整合到我们这个B/S项目中之后,程序中的Console提示语句以及类似的语句依然保留着,并没有做修改。但在本地以及我们的服务器上测试并没有出现问题,我也就没关心这个了……
因为在我们这边重新找了一个服务器发布之后,还是没重现问题,又不确定是不是和公司的VPN网络以及各分公司的交换机SNMP服务开启状态有关,所以一直没找到问题的根结,只得一点点排查。发布到武汉那边的服务器之后问题重现了(武汉那边交换机的SNMP服务和北京一样,并没有开启)……我用Debug Diagnostics和WinDbg分析DebugDiagnostics抓到的dump文件,并没有找到有用的信息(WinDbg一直没配置好,老提示Symbols找不到或者版本错误,试了不同版本的Symbols都没用)。
今天项目经理终于回来了,参与进来解决这个问题。模拟北京服务器上的环境(SNMP开启状态等),重新换了一台服务器来发布,终于在我们无锡这边把问题重现了,初步确定与交换机SNMP服务是否开启无关。于是再从程序中比较明显的问题入手,一点点解决:在使用类中的一个静态DataTable成员之前先初始化一下以解决我们后来测试到的数据重复的问题;注释掉程序中的Console提示以及类似的语句,抛出异常并在页面后台代码中捕获,捕获到异常之后在页面中弹出提示。终于,获取不到交换机端口信息以及提示“Service Unavailable”的问题没了,可是有些交换机的SNMP服务明明开启了,却一直获取不到端口信息。程序中的异常是“请求超时”(类库中的自定义异常),于是我们又开始怀疑那个SNMP类库了(感觉这个开源的类库太复杂了,不确定是否适用于B/S项目……),也不确定是不是交换机的问题(对SNMP理解不透彻)。而且我们使用读取交换机MIB信息的软件是可以读取到这些在我们系统中读不到的交换机的端口信息的……于是又云里雾里思考了好久……后来直到下班时间都没找到问题……
这之间收到以前一个项目的客户发来的Flash源文件。用这个Flash之前要改一下里面的链接……几个按钮的AS代码一下子就找到了,很快就改好了,可是一个图层的AS脚本按之前的方法却怎么也找不到,翻了好久(菜单,子窗口,右键都翻遍了)……突然想到可以查找,于是查找了一下对应的AS,找到了却不能定位到具体的AS代码……又翻查了好久想找到具体的脚本……最后才想起既然查找到了为啥不用“替换”的功能……这才把问题解决了o(╯□╰)o……解决完这个问题虽然早已到下班时间了,但经理没走,还是得和他一起继续找那个网络管理模块的程序问题(想到那个SNMP类库就害怕……)……排查到最后发现竟然是有人录错了交换机的读写口令,所以我们的系统一直没读出这些交换机的端口信息o(╯□╰)o……
原来,项目中看似很难的问题可能很简单,感觉难是因为没找到问题的根结对相关知识理解不透彻。项目存在问题很多时候是一些细节没处理好。合作交流,集思广益,理清思路,不依赖于搜索引擎才有助于快速的解决问题。
PS:
网站提示“Service Unavailable”很有可能是程序的问题(也不排除IIS设置的问题)。
这个项目是之前的一个.NET项目组一直在做的,谁知年后他们项目组的老大带着几个核心人员集体跳槽了,于是就转交到我们项目组了(还好交接工作没出现大的问题)……网络管理这一块年后并没有完成,是在我们经理的催促下才基本完成的,由于人手以及时间的问题并没有把好测试关,代码也不规范……这是导致问题的根源……接下来可能还有更棘手的问题(因为需求一直在调整,项目的测试并没有到位),但我知道有些问题很有可能只是纸老虎,发挥团队以及网络的力量,有条理地分析问题,没有什么解决不了的!(有空还得仔细研究研究那个SNMP library)