|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?站点注册
×
本帖最后由 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 左右的数据,超过的数据部分会被忽略或产生异常。
|
|