msgtogcr 发表于 2010-9-9 22:31:53

pb12 开发 webservice 注意事项

本帖最后由 msgtogcr 于 2011-8-18 23:58 编辑

正在把一个 c/s 的 mis 系统改造为基于 webservice 的 c/s/s 架构,以下是全程记录:

系统环境:winxp sp2 + oracle10g + iis5.1

1. 检查服务端 iis 是否正常,若 iis 不能运行或浏览默认网页时报权限类错误,检查“本地用户和组”中 3 个相关的内置账号是否启用(启动 iis, asp.net, internet 来宾)。

2. 开发 ws,服务端除须安装 pb.net 外,还须安装 framework3.5 sp1 和 framework sdk2.0,为简单起见,直接安装 vs2008,之后再打 vs2008 sp1 补丁,微软官网的那个补丁包需要用较新版本的 iso 工具才能正常读出。

3. 由于 .net 语法更为严格,有符号和无符号的同类型数值变量不能做互相赋值或比较等操作,例如:int 和 uint;此问题可能会导致发布时 pb 直接崩溃!

4. 无符号数值类型不能用于递减循环,例如:for uint = 100 to 1 step -1;发布时通常会给出编译警告,但有时却会导致 pb 异常关闭!

5. 全局函数不能使用 this 代词,可用 GetApplication() 替代。

6. 在 c/s 应用中调用 ws,需要把 ..\share\powerbuilder 中的 pbsoapclient120.pbd(java 标准)或 pbwsclient120.pbd(.net 标准)文件加入到 target 的库列表中;它们分别对应 EasySOAP 和 .Net 引擎,发布时除了要带上这个 pbd 文件外,同时也要带上对应的 pbx 和相关的 dll 文件。

7. 开发 .net 应用的话,必须把 pbwsclient120.pbx 导入到自已的 pbl 中;如果导入报错的话,可以从 pb 自带的 ws 例程中导出相关的 3 个对象为 soap*.sru 文件,再导入自己的 pbl 里。

8. 如果调用 ws 时 CreateInstance() 出现 runtime 错误,则可能是由于老版本 pb 在 system32 目录下放有与 pb 共享目录下同名的老版本 dll,删除或用新版本 dll 覆盖即可(如 libeay32.dll)。

9. 发布 ws 的详细日志文件可以在 pb2cstempout 目录中找到,有些怪异错误的原因就在里面。

10. FileOpen() 必须用流模式,所以 FileWriteEx() 也必须用 blob 类型。

11. (尚待进一步研究)不能直接读写 iis 虚拟目录以外的文件,必须把其添加到 iis 的虚拟目录中;同时要保证该文件所在目录及上层目录 asp.net 拥有相应的访问权限;虚拟目录的真实路径可用 MapVirtualPath() 取得,但不能用真实路径访问虚拟目录的文件,也不能以相对路径访问应用的上层目录及文件(仅可访问 /app_root/file/session/__webservice__/c 中会话产生的临时目录及文件)。

12. 发布给外界调用的 ws 函数不允许重载(这的确是个很糟糕的限制)。

13. 应用对象不能声明实例变量,全局变量只对当前会话有效;应用对象的脚本不会执行;析构事件不会执行;以 post 方式调用的函数不会执行。

14. 创建对象时所用的模板类型必须和声明的一致,不能降级构造;例如:继承自 transaction 的自定义对象 n_tran_base,声明为 n_tran_base itran_obj,则实例化时不可以写成 itran_obj = create transaction,而必须是 itran_obj = create n_tran_base(赋值、比较操作同理)。

15. 数据库驱动目录须要设置 asp.net 的访问权限(重启),如 c:\oracle\product\10.1.0\client_1。

16. 要使用 sybase datawindow ps 打印机,需要在打印机的安全设置里添加上 asp.net, internet 来宾, network service, 启动 iis四个账号为允许打印(第一次打印时必须设置,之后可以删除),方可确保 PrintDatawindow(), Print(), SaveAs() 能正常生成 pdf 文件(但 db ole 控件的内容不能显示)。

17. 可以通过 inet 和 internetresult 两对象的配合,获得 /app_root/print/session/__webservice__ 打印目录下的文件列表,并分析出打印后的正确文件名;同理,亦可用此方法获得 pdf 文件的内容。

18. (尚待进一步研究)Run() 函数已失效,可用 API 替代,如 CreateProcess() 启动服务端的 exe 文件,但受限于 iis 的权限控制,只能在任务管理器中看到此进程,并不能正常运行(即便是无界面的 exe 也是如此)。

19. (尚待进一步研究)据 sybase 新闻组的说法,ole 对象在 .net 应用中无法使用,这并不是 pb 的限制,而是微软自身的问题。所以 db ole 控件也失效了,如果仍想在客户端使用的话,可在检索含有 db ole 的数据窗口时转交给 c/s 程序执行,然后再传回 ws。

20. 关于进程间通讯,DDE 仅能建立管道,但无法执行链接;Send() 函数已失效,只有通过 API SendMessage() 向服务端进程发送消息(ws 没有窗口句柄,不能收到消息),本应使用 WM_COPYDATA 通过共享内存来传递数据(在 other 中拦截 message.number=74),但服务端进程收到的却是错误数据;既然只能传递消息本身,倒不如用 pbm_custom01(1024) 更加简单。

21. 若数据库驱动不能使用 iis 连接池的话,则必须在 ws 执行完成后,由代码主动断开连接;由于 ws 的析构事件不会执行,所以必须在每个接口函数返回前断开连接;并且 destroy 所有手工 create 的对象,否则会导致系统内存溢出错误。

22. 调用 ws,如果应用服务器需要身份验证,则除了需要通过 SetOption() 分别设置用户名和密码外,还要调用 SetProxyServer() 指定应用服务器的地址和端口,否则会导致 401 错误(权限不足)。

23. 调用 ws,如果出现莫明其妙的异常或服务方接收不到参数,就要检查服务方提供的 wsdl 文件是否有问题,例如函数名和参数名以及大小写是否与对方 ws 代码中的一致。

24. 函数的参数必须使用标准数据类型,否则发布时会导致 c# 编译器调用 pbwsemit.exe 错误。(blob 相当于 byte 数组,而且 blob 数组也强制等同于 byte 数组)

25. GetFullStatus() 只能获取 8M 左右的数据,超过的数据部分会被忽略或产生异常。

yyss22 发表于 2010-9-16 08:24:04

你好!最近,我也在用pb12,希望向你学习,请问有QQ号吗?

msgtogcr 发表于 2010-9-16 21:25:42

本帖最后由 msgtogcr 于 2010-9-16 21:31 编辑

你好,楼上的朋友!我基本上不用 QQ,而且我觉得真的需要交流的话,论坛其实就是很好的地方,无论是否解决问题,都可能让更多人受益,何乐而不为呢,你说是吧。

pb12 我也才用一个月,主要是为了使用 webservice,所以目前一切也仍在摸索阶段,很高兴与大家一起探讨,共同提高!

yyss22 发表于 2010-9-17 08:11:38

请问:在PB12.net中,怎么 引用外部的 dll 文件?在哪里操作?

msgtogcr 发表于 2010-9-17 22:45:06

你是用 .net 的 ide 做开发么?如果是的话,我就不知道了,因为目前那只是个测试性的东西,而且也只能做 wcf 和 assemble 这两种东西,我是一点也没有研究啊!不过,我觉得搞 asp.net 的程序员应该会清楚,pb.net 估计不会另搞一套的。

hayado 发表于 2011-1-8 23:02:52

楼主辛苦了,希望能多些交流

msgtogcr 发表于 2011-1-9 22:11:30

楼上兄弟客气了,只是目前手头事有点多,ws 的研究进展很慢,我写这篇东西的目的本来就是希望能与各位同道交流心得,自己也可以少走些弯路。

zbplayer 发表于 2011-1-25 00:00:10

这个还得看看,用的上!
页: [1]
查看完整版本: pb12 开发 webservice 注意事项

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com