写在前面
这篇文章应该在 3 年以前就写的,那时候 Visual FoxPro 6 刚推出,它的一个卖点就是:与 ASP 合作,充当 Web Server。总的来说,国内对技术的理解、国内对技术的需求、国内对技术的接纳都明显落后于国外——在今天,应该是讨论 Web Service 的时候,我还是愿意花一点时间和大家一起探讨 Web Server。
至于,Web Server 与 Web Service 的区别,BOE 会有专题讨论。
我从来没有写过 ASP 代码,本文权作为引玉之石……
缘起
前些天,Boby 给了我一个 QXF 大侠写的 FoxWeb 应用,很不错。FoxWeb 是 Visual FoxPro 的一个第三方产品。当时我就在想,能不能用纯 Visual FoxPro 实现相同的功能呢?
当然可以,Web Server 技术与 FoxWeb 应用的核心技术都是 Visual FoxPro 编写的 COM 组件,只是作为第三方产品 FoxWeb 又加入了一些其他的功能,听说提供一种功能类似于 ASP 的脚本语言,它的语法习惯与 Fox 差不多。
这里,我们将不使用任何第三方产品来实现一个简单的 Web Server。现在,就让我们开始吧!
总的构架
基本 WEB 页面
你应该知道,最基本的页面(纯静态的那种,www.boeworks.com 就属于这一类) 是如何被显示在你的浏览器中的,你还应该知道浏览器的最基本的工作原理。
客户端浏览器向WEB 服务器发送 WEB 页面请求,然后 WEB 服务器处理这种请求,并通过 Internet 将 WEB 页面的 HTML 代码发送回发送请求的客户端浏览器,由浏览器来解析 HTML 代码,最后显示出来。这里的 HTML 代码当然可以包括一些其他的客户端支持的代码,如CSS、DHTML、XML甚至是JScrip、VBScrip,总之它们与 HTML 代码一样在客户端浏览器里执行或者解析。
总的来说,基本 WEB 页面就是 WEB 服务器收到请求后“直接”把 HTML 代码发送回给客户浏览器。这种模式的系统构架图是这样的:
服务器端的动态页面
这种简单的页面处理模式并不能解决我们的需求,因为 WEB 服务器只是简单的把现成的 HTML 代码返回给客户浏览器,这就显得非常“木讷”了。例如在一个论坛网站(像 www.myf1.net 或者 http://www.foxcn.com)里,难道每有一个新的帖子,网站的维护者就要重新做一张页面吗?这显然是不可能的!
为了在 WEB 服务器接受客户浏览器发送请求和返回页面之间能灵活的干预页面的产生,人们提出了很多办法:CGI、ISAPI、ASP、ASP.NET、PHP、JSP……它们的共同特点就是:干预被返回的WEB 页面的生成,这样就能根据 Web 服务器的具体(往往是根据数据库)情况产生不同内容的网页,这就是所谓的动态页面。刚才说的 www.myf1.net 就是基于 ASP 的(但是没有用到外挂组件),而 http://www.foxcn.com是基于 CGI 技术的。
从 MS 方面看,对动态网页的支持主要是通过 CGI、ISAPI、ASP 和 ASP.NET 实现的,它们都运行在 MS 的 WEB 服务器产品 Internet Information Server(IIS)上。
好了,回过头来看我们的 Visual FoxPro 是如何参与到这些应用中去的。Visual FoxPro 完全支持 ISAPI、ASP、ASP.NET,Visual FoxPro 可以为它们提供组件。说到组件,当然是指 Visual FoxPro 开发的 COM 组件了。
今天的专题不涉及 ISAPI 和 ASP.NET 与 Visual FoxPro COM 组件的结合应用(BOE 有计划专题讨论与 ASP.NET 的结合应用的问题),这里我们只是集中精力讨论 ASP 与 Visual FoxPro 开发的 COM 组件的联合应用。
当 ASP 离开了 COM 组件
首先,我们用自己的 Fox 经验思考一下:Visual FoxPro 编写的 COM 一般能提供一些什么功能?我的答案是对数据库的处理,包括 Visual FoxPro 的本地数据和各种类型的远程数据(来自Access、SQL Server的数据)。确定了这一点以后,再让我们看看在 ASP 里有没有处理数据库的语素:有,就是著名的ADO。ADO 属于 ASP 的内置(Built In)组件,类似的还有 Session、Application 等组件。
据我所知,现在有不少人在 Visual FoxPro 里使用 ADO 了,那么再用 Visual FoxPro 开发 COM 给 ASP 调用是不是多此一举?我看,不见得,原因如下:
第一。在 ASP 里驱动程序运行的是脚本语言(通常是 VBScrip)。既然是脚本语言,就注定了 ASP 程序是解释执行的,效率很低!而 Visual FoxPro 是编译执行的语言,漫长的 Fox 历史证明了它处理数据、处理字符串时迅捷的速度,把大量处理数据库、处理字符串的运算放在 Visual FoxPro 编写的 COM 组件里,无疑能提高 ASP 的运行效率。有人测试,用了 Visual FoxPro 的 COM 以后比纯 ASP 的程序的速度提高几倍甚至几十倍!
第二。如果你看过别人编写的 ASP 的代码,你可能会头疼——专业的程序员会很不习惯 ASP 里HTML 与 VB 脚本混杂在一起。所以,常常有人抱怨:页面一变,ASP 代码就混乱的一塌糊涂……如果,我们把相关代码分装在 COM 组件里,利用 Visual FoxPro 面向对象和面向过程的优势,能使得整个代码更整洁、更容易维护。
第三。在一些大型应用里,可能要考虑服务器的负载平衡和分布事务,这通过单纯的 ASP 是根本无法解决的。而 Visual FoxPro 编写的 COM 支持 MS 的 COM+,通过 COM+ 就能解决负载平衡和分布事务的难题。
第四。这是最实惠的一点。用了 COM ,就能使传统的 Visual FoxPro 程序员一下子成为了 WEB 解决方案的一员,而且不需要另外学习更多的新技术,起码对数据的处理,我们是“行家里手”。
ASP 里调用 Visual FoxPro 编写的 COM 的构架
上面这张就是“ASP 里调用 Visual FoxPro 编写的 COM ”的构架图,这里我解释一下:
与“基本 WEB 页面”类似,客户端浏览器发送请求到 WEB 服务器,WEB 服务器接收到有关请求后执行 ASP 脚本程序,产生 HTML 代码返回给发送请求的客户浏览器,客户浏览器解析 HTML 代码,显示 WEB 页面。在执行 ASP 脚本程序时,可以根据需要调用各种 COM 组件,一般的 COM 组件会返回一些数据以帮助 ASP 生成 HTML 代码。这里的 COM 组件可以由各种开发工具编写,当然包括 Visual FoxPro 编写的。如果是 Visual FoxPro 编写的 COM 组件,在运行时必须有相关的Visual FoxPro 运行时刻支持。例如,在 Visual FoxPro 7 里,编译成为“多线程”进程内的 COM 的运行时刻文件是 VFP7t.dl。
在上面这张图里,大家可能对 ASP.DLL 会有疑问,这其实是 ASP 的运行库文件,ASP 的功能都来源于它!
更新 COM 组件
一般来说,COM 组件运行在 IIS 的内存空间里(进程内组件)。当 IIS 被启动(往往是开机的时候),第一次调用 COM 组建以后,COM 组建就运行在 IIS 的内存里了(所以第一次调用特别慢),这时我们就不能重新编译、更新 COM 组件了。以前,往往看到重新启动计算机的建议,这就给调试 COM 组件带来了很大的麻烦。这里,我介绍一种简单的方法:
在命令行窗口里执行:iisreset
它的作用是尝试关闭并且重新启动 IIS ,这样被运行的 COM 组件就被释放出来了。这样,就能很容易的重新编译、更新 COM 组件了!