抓虫记之二:WSDL中消失的函数定义
还是那句老话,现象总是扑朔迷离。 这次的现象更加奇怪,在一个webservice的接口定义中,某个新定义的方法总是看不到。可是看了实现代码,确实已经公布了。这是为什么呢? 先说明一下实现环境,这个是在Delphi环境下编写WebService的。大家可能说VisualStudio就不会有这样的问题了,这个我不否认,但是我相信了解这个过程,对大家会有很多帮助的。 其实,不管哪种语言,WSDL的描述基本都是自动生成的,也不需要我们去做任何额外工作。但是,既然这里面出现了问题,就只能硬着头皮去了解这些内部实现了。 在Delphi中,是在WebModule中的TWSDLHTMLPublish类型的组件来完成的。而这个组件,在获取HTTP请求之后,在接口定义中查找,找到后,依据RTTI,翻译成WSDL描述语言。 在跟踪代码的过程中,发现找到接口之后,明明接口定义了12个方法,调试器却只显示10个方法,少了2个方法。甚么原因呢? 说实话,我不是圣人。我一开始确实怀疑Delphi的编译器出问题了。但后来强迫自己休息了一下之后,突然领悟到,既然方法不一样多,是不是找错了接口定义呢? 这是一个伟大的跳跃式思维。因为,我开始怀疑错误来源于我自己。很多时候就是这样,怀疑别人,总是找不到答案。怀疑自己,却只有一步之遥就可以成功。 原来,我在实现这个WebService的时候,由于协作的需要,需要调用其他的WebService。本来这是没有问题的。但是,我做了一个偷懒的工作。我把一些常用的Webservice全部集中起来了,这样其他应用程序调用的时候非常方便。不巧的是,这些常用的Webservice中,就包含今天出错的这个。 也就是说,在服务器的实现过程中,很可能出现了接口的重复定义!因为Delphi在服务器注册机制,和客户端代理(Proxy)的注册机制是一样的,这导致了冲突! 检查了一下代码,果然如此。原来,由于服务器新的接口一直没发布,所以,服务器的客户端代理接口也没更新,这样,就出现了两个版本的接口定义。 开头出现的消失的函数定义,在调整完接口注册顺序,又神奇般出现了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |