看到这个标题,我想,不少人会有同感:是呀,个人eas服务器就是在防火墙的后面,谁会把eas服务器直接放到公网上呢?程序员
我想,若是你的eas也是防火墙的后面,你必定会遇到这个问题,connection变量执行connecttoserver返回0,也就是能够正常链接到eas服务器,但执行createinstance的时候确返回50,没法建立组件实例,后面的没有办法执行了。怎么回事?好好的代码,都调试了上百遍了,开发状态下一点问题没有,甚至将程序链接到内网的eas服务器上,又没有问题了。或则你会再作一次试验,将eas服务器直接放到公网上,让eas直接在公网ip上监听,呵呵,重大发现,经过了!服务器
可在你高兴的同时,你一样也会感到沮丧,难道eas只能直接暴露在公网上?网络
是呀,这个问题严重了,或许你已经开始骂sybase是笨猪了。但事实是这样的吗?app
不错,你冤枉sybase了,人家早就考虑到这个问题了,在eas的开发文档里,有一节里专门讲解了这个问题,文档里为了能把问题说明白,还特地画了几个网络结构示意图。什么?你不知道?!!那你还怨sybase?google
那到底该如何解决这个问题呢?调试
其实很简单,看看Connection对象的options参数的设置,里面有这么两项:server
ORBProxyHost Specifies the machine name or the IP address of an SSL proxy.
ORBProxyPort Specifies the port number of the SSL proxy.对象
是的,就是这两个家伙,它能够帮你解决问题。ip
可能你会说了,这两个选项参数是供SSL链接用的呀。不错,但同时它还能解决你的问题,还有什么比能解决你的问题更让你兴奋得呢?ci
如今,跟我作,1234,2234,3234,再来一遍.......!
跑题了,不是作健身操,是解决那个让你头疼的该死的问题!
或许你的程序在链接eas服务器和建立组件实例的时候的代码大体以下:
connection lconn
lconn = create connection
lconn.application=""
lconn.driver="jaguar"
lconn.location="iiop://202.102.*.*:9000"
lconn.connecttoserver()
lconn.createinstance(in_p, "pkg/com")
是的,你的代码没有错,这在局域网或则eas直接在公网上能够正常运行,但若是防火墙上作了端口映射,你的代码就会在lconn.createinstance(in_p, "pkg/com")的时候返回50,建立组件失败了。
为了解决你的问题,你须要在lconn.connecttoserver()以前,增长以下这行代码:
lconn.options="ORBProxyHost='202.102.*.*',ORBProxyPort='9000'"
好了,就这么简单,再运行一下你的程序,看看,是否能够正常运行了?
Congratulations!!笑了吧,是否是心情很爽,解决问题就是这么简单!
好了,请你再切换到将程序链接到你的局域网的eas,傻眼了吧,又出错了?!
是的,确定出错,你没有作地址映射,非要让程序按照地址映射的方式访问eas,不错才怪!那怎么解决这个问题呢?还问我?本身想一想!你那肩膀上扛着的那玩意是干吗用的?
怎么,仍是想不到怎么解决这个问题?看看eas的管理器,eas管理器的登录界面上有一个use proxy的复选框,人家就是这么解决的,你呢?
好了,按说,问题到这里,应该是获得了完美解决。可你就不想知道为何会这样吗?所谓知其然,还要知其因此然,知之为知之,不知为不知,是知也!!完了,又跑题了!好回到这个问题上来,究竟是什么缘由致使这个问题呢?其实eas的开发文档里也没有说的太明白,只是告诉咱们该如何解决。
通过个人分析,其实问题的根源是这样的。
可能你也发现了,经过端口映射搭建的eas,虽然没法建立组件实例,但http访问eas上的网页是没有问题的,是的,你也发现了。其实缘由也很简单,由于http协议是无状态的,但iiop协议是有状态的。什么是有状态网络链接协议?你能够在百度上google一下,我这里就再也不罗嗦了。
实际上,当connection对象执行connecttoserver的时候,iiop协议会返回eas服务器的地址和端口号,由于eas在内网ip监听,因此connection对象经过iiop协议返回的eas服务器地址就是这个内网地址和内网端口,当connection对象执行createinstance的时候,其实是去找上次带过来的那个内网ip,想一想,你的客户端怎么可能访问到人家的内网里面呢?不然还要什么公网IP!!这样一来,实际上connection在执行createinstance的时候,就去客户端所在的局域网里去找eas了,那怎么会有?建立失败,返回50就是它惟一的选择。你经过设置lconn.options="ORBProxyHost='202.102.*.*',ORBProxyPort='9000'",实际上就是告诉connection对象,去这个地址去找eas,而这个地址又被防火墙影射到内网实际的eas服务器上了,OK了,找到了eas服务器,就没有问题了。
事情有时候就是这么简单,可你可能想破脑壳都不知道该如何解决。
不过,要说sybase没有一点责任也不对,至少,sybase应该在pb的帮助文件里,将这两个选项参数说的更加明白一些。sybase高估了咱们中国的程序员,不少人看不明白eas的开发文档,甚至不少人可能都不知道eas还有一套开发文档!