发布Web Service
在IIS中建立虚拟目录
这个步骤很简单,建立一个虚拟目录。设定好以后的属性页是:
图一
这里我只设定了两个属性,其他保持默认状态。设名称为:First_web_service,设本地路径为DLL所在路径,这里是:D:\VFP7_Web_Service。
在Visual FoxPro 里发布 Web Service
工具-〉向导-〉Web Services
图二
弹出如下界面:
图三
这里,COM Server里,我们选择刚才编译的那个DLL。
为了获得更多信息,按“Advanced...”按钮,弹出如下对话框:
图四
这里 WSDL 文件是必须设定的,它描述这个Web Service 能够提供的服务,以及对外的接口。我们让它存放在虚拟目录下,文件名是FoxWebService.WSDL。
这里还有一个有用的选项就是“IntellSense Scripts”,关联Web Service与Visual FoxPro开发环境之间的关系:将Web Service的接口注册到IntellSense中,这样在Visual FoxPro里调用这个Web Service就会很方便的;当然,这里也可以不将Web Service 注册到 IntellSense 中,而在Visual FoxPro 里注册,具体方法参见:《Visual FoxPro 7 全新登场--Web Service Client》。
还有一个选项“Automatically generate web service file during project build”,意思是:当重新编译项目生成COM时,同时建立新的Web Service文件;这个选项其实是一个Visual FoxPro的Project Hook,同样可以在Visual FoxPro的开发环境里设定。
这里填写完有关数据之后,按“OK”,回到图三。按动“Generate” 按钮,如果注册成功,将跳出对话框:
到这里,算是到公告成了。
测试Web Service
简单的测试代码
怎么使用一个Web Service,如果你看过《Visual FoxPro 7 全新登场--Web Service Client》一文,应该是没什么问题的,这里只给出代码:
*请务必保证 C 盘根目录中不存在FoxWebService.txt文件,如果有就删除它(我们的目的是证明Web Service 是“无状态”的)
LOCAL oweb as VFPWebService_WS
LOCAL loWS
loWS = NEWOBJECT("Wsclient",HOME()+"ffc\_webservices.vcx")
loWS.cWSName = "VFPWebService_WS"
oweb = loWS.SetupClient("http://BOEWORKS/first_web_service/FoxWebService.wsdl", "FoxWebService", "FoxWebServiceSoapPort")
XMLTOCURSOR(oweb.GetInvoice(0),"test")
?oweb.GetSumSales({^1997-01-01},{^1997-3-30})
如果测试成功了,就请查看C 盘根目录中的 FoxWebService.txt 文件,我的文件中的内容是(根据试验时间,结果会有不同):
开启时间23:50:47关闭时间23:50:48开启时间23:50:50关闭时间23:50:50
无状态的Web Service
这里我们发现,在这段代码执行过程中,Web Service 对象创建、毁灭了两次;而几乎同样的代码,基于COM的应用,对象只创建、摧毁一次。——这就说明了Web Service是“无状态”的,客户程序每一次调用,就自动创建,调用完毕就自动摧毁。这里调用了两次,分别是调用GetInvoice()方法和GetSumSales()方法。这两次方法的调用是没有任何关系的,也就是说,Web Service是不会保存前一次调用后产生的状态,供以后调用时使用,这与传统的COM调用是有很大的区别的。
这里最有迷惑力的是这一段代码:
oweb = loWS.SetupClient("http://BOEWORKS/first_web_service/FoxWebService.wsdl", "FoxWebService", "FoxWebServiceSoapPort")
看上去等同于调用COM时使用的CreateObject(),我还没有仔细查看SOAP的文档,但我想这段代码只是请求Web Service的接口,并在客户机本地初始化一些东西,而对Web Service没有什么影响。
无状态的利弊
无状态的最大好处就是高效率,Web Service不是为几个客户提供服务的,它不可能记忆每一个客户端的请求状态,如果那样做,系统效率将很低很低。但是,如果Web Service不能知道客户程序的状态,也不能与客户程序进行很好的交互,不能很好的交互,就不能做出大的、好的项目。这是俄我想起了ASP,作为Web 应用,它也是无状态的,但为了实现服务器与客户机的交互(状态记忆),就提出了所谓的保存在客户端的 cookies 和服务器端的Session对象……以求效率与功能的平衡。
到底什么是Web Service的发布
后记
Web Service 是很新、很流行的东西,很欣慰——Visual FoxPro 7 能很好的支持它的开发。虽然我在学习过程中遇到很多磨难,这不能说这种技术有什么不好,只能认为我的水平太次,真的应该好好学习了……
又是凌晨一点了,我很担心这篇东西的价值——有多少网友能顺利的把试验做下来,毕竟本文涉及了很多 Visual FoxPro 开发人员不熟悉的东西……