本文内容
- 背景
- 开发环境
- 错误表现
- 错误分析
- 解决方案
背景
08 年毕业时,参加一个项目,由好几家公司共同开发,我们公司做数据仓库部分,包括建立数据仓库和开发之上的数据仓库管理系统。其中,我们公司将 OLAP 分析子系统包给了一个大学,之后再进行系统集成。OLAP 子系统包含用 ArcGIS 开发的地理信息展示和用 MatLab 开发做图分析功能等。
开发环境
开发环境:
- 客户端:Windows 2003 Server、IE 6+、VS 2005、MatLab 2009b
- 服务器端:Windows 2003 Server、IIS 6、ArcGIS SDE 9.3.2、MatLab 2009b runtime
错误表现
当 Web 应用程序同时涉及 GIS 和 MatLab 开发时,MatLab 做图时会抛出系统内存异常错误,该错误不可再现。如果抛出此错误,则之后虽然也可做图,但将始终出现该错误提示窗口。而 GIS 应用程序运行正常。
错误分析
起初认为是 MatLab 自己的 BUG,毕竟这个程序太大了,跟 GIS 有得拼,于是反编译 MatLab 的核心 dll 文件,希望通过研究它的底层实现来规避这个问题。还对 IIS 进行了各种设置,也不能解决该问题——系统集成是件痛苦的事,有太多不可预知的问题出现。
再后来,认为 GIS 和 MatLab 有冲突,但是冲突在什么地方,不得而知。
解决方案
发现问题的所在,有点巧合。既然 GIS 部分的应用程序没问题,那就先不管它。把 MatLab 应用程序独立出来,再删掉 Web.config 文件中关于 GIS 的所有配置,但运行时,还是报错,调试来调试去,设置来设置去,还是不好使……最终,我查看了 machine.config 文件,既然该文件对 Web 应用程序来说,是“大环境”,那留点最基本的就好了,就无意间删掉了 <identity impersonate="true" userName="主机名\用户名" password="密码"/> 小节。还在研究时,突然同事说:“好使了!”,惊异地看着我说:“你改什么东西?”我当时一顿回忆……根据时间点,应该是 identity 小节。于是,立刻意识到,也许问题真在这里……
我们知道,
- 在页面上显示底图,并将图层数据叠加到底图上。访问空间数据库 ArcSDE 需要权限。此过程,ArcGIS 会在 Web.config 文件中自动添加 <identity impersonate="true" userName="主机名\用户名" password="密码"/> 小节;
- machine.config 和 Web.config 文件,前者是针对一台 Web 服务器,后者是针对某个 Web 应用程序。一台 Web 服务器可以有多个 Web 应用程序。machine.config 文件会作用在所有 Web 应用程序上。
而原因正是在 <identity impersonate="true" userName="主机名\用户名" password="密码"/> 这句话,虽然 GIS 需要,但是 MatLab 完全不需要,有这个小节 MatLab 做图时反而抛出异常。知道问题所在后,解决就很简单了。
- 首先,取保 machine.config 文件不配置该节,干净点;
- 其次,将 Web 应用程序中的 GIS 部分和 MatLab 部分,其一拆成另一个 Web 应用程序,并将其改成虚拟目录,集成在一起。