pb12 开发 webservice 注意事项

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

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

2. pb 开发 ws,必须安装 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 引擎。

7. 使用 .net target 做客户端应用的话,必须把 pbwsclient120.pbx 导入到自已的 pbl 中;如果导入报错的话,可以从 pb 自带的 ws 例程中导出相关的 3 个对象为 *.sr* 文件,再导入自己的 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(赋值、比较操作同理)。

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 的析构事件不会在退出时立即执行,所以必须在每个接口函数返回前断开连接;而且,为防止函数中忘记断开或异常退出,析构事件仍需写上 disconnect;。

你可能感兴趣的:(webservice,Sybase,asp.net,asp,IIS)