关于kylix开发DSO的问题,Supermay请进,各位大侠请进 ( 积分: 0 )

  • 主题发起人 VegatableBird
  • 开始时间
V

VegatableBird

Unregistered / Unconfirmed
GUEST, unregistred user!
现要做WebService,用kylix3开发,web服务为Apache

我先是在Windows上开发,工具Delphi7,其间基于Apache1.*、Apache2.*都试过,Apache版本分别为1.2.38和2.0.53。
新建一WebService工程,Apache2.* Shared Module(DLL),命名为helloWorldP,修改apache_module name 'helloWorld_module';
Delphi提示“Create Interface for SOAP module”选择“yes”,Service name为helloWorld。在创建出的helloWorldImpl.pas和helloWorldIntf.pas中加入function GetMyStrs: String; stdcall;简单返回一个字符串
编译后copyhelloWorldP.dll文件到Apache的modules目录下,修改conf目录下的http.conf文件,加入如下文字:
LoadModule helloWorld_module "D:/dev/Apache Group/Apache2/modules/helloWorldP.dll"
<Location /helloWorld2>
SetHandler helloWorldP-handler
</Location>
重起Apache2服务(Apache1类似)
打开IE,地址栏输入“http://127.0.0.1/helloWorld2”,可以看到WSDL等信息,其接口GetMyStrs可以被其他客户端调用。

现在要转移到Linux上。从网上下载httpd-2.0.53.tar.gz,解压后,进入该目录编译安装
./configure -enable-so
make
make install
将HTTPD2、ApacheTwoHTTP和ApacheTwoApp源码copy到kylix的source/internet下。同样建立WebService工程,将引用的ApacheApp改为ApacheTwoApp,但其他HTTPD2、ApacheTwoHTTP两个文件我没有用到。compile工程编译通过,Build会有警告:
[Warning] xdom.pas(16372): Error converting locale string 'im fentlichen Dokument ' to Unicode. String truncated. Is your LANG environment variable set correctly?
不知该警告是否影响到Apache无法装载该模块?
copy生成的libhelloWorldP.so到apache2的modules目录下,修改conf目录下的http.conf文件,加入如下文字:
LoadModule helloWorld_module modules/libhelloWorldP.so
<Location /helloWorld2>
SetHandler libhelloWorldP-handler
</Location>
重起apache服务,报错:“../bin/apachectl: line 100: 5162 Segmentation fault $HTTPD -k $ARGV”
看到有帖子讲要修改HTTPD2.pas文件,但我没有引用该文件,还是试了一下
MODULE_MAGIC_NUMBER_MAJOR = 20020612;这句注释掉,改为
MODULE_MAGIC_NUMBER_MAJOR = 20020903; { Apache 2.0.51..54 }
MODULE_MAGIC_NUMBER_MINOR = 1;这句注释掉,改为
MODULE_MAGIC_NUMBER_MINOR = 9;
conn_rec = {$IFDEF LINUX}packed{$ENDIF} record这句之前加了
ap_conn_keepalive_e = (AP_CONN_UNKNOWN, AP_CONN_CLOSE, AP_CONN_KEEPALIVE);
找到
(** Are we still talking? *)
flags: Cardinal;
{ The following are in the flags bitset:
unsigned aborted:1;

(** Are we going to keep the connection alive for another request?
* -1 fatal error, 0 undecided, 1 yes *)
signed int keepalive:2;

(** have we done double-reverse DNS? -1 yes/failure, 0 not yet,
* 1 yes/success *)
signed int double_reverse:2;
}
这一段,改为:
(** Are we still talking? *)
flags1: Cardinal;
{ The following are in the flags bitset:
unsigned aborted:1; }

(** Are we going to keep the connection alive for another request?
* @see ap_conn_keepalive_e *)
keepalive: ap_conn_keepalive_e;
还是不行,请各位大侠指教
小弟刚刚注册,没有分送,见谅
 
现要做WebService,用kylix3开发,web服务为Apache

我先是在Windows上开发,工具Delphi7,其间基于Apache1.*、Apache2.*都试过,Apache版本分别为1.2.38和2.0.53。
新建一WebService工程,Apache2.* Shared Module(DLL),命名为helloWorldP,修改apache_module name 'helloWorld_module';
Delphi提示“Create Interface for SOAP module”选择“yes”,Service name为helloWorld。在创建出的helloWorldImpl.pas和helloWorldIntf.pas中加入function GetMyStrs: String; stdcall;简单返回一个字符串
编译后copyhelloWorldP.dll文件到Apache的modules目录下,修改conf目录下的http.conf文件,加入如下文字:
LoadModule helloWorld_module "D:/dev/Apache Group/Apache2/modules/helloWorldP.dll"
<Location /helloWorld2>
SetHandler helloWorldP-handler
</Location>
重起Apache2服务(Apache1类似)
打开IE,地址栏输入“http://127.0.0.1/helloWorld2”,可以看到WSDL等信息,其接口GetMyStrs可以被其他客户端调用。

现在要转移到Linux上。从网上下载httpd-2.0.53.tar.gz,解压后,进入该目录编译安装
./configure -enable-so
make
make install
将HTTPD2、ApacheTwoHTTP和ApacheTwoApp源码copy到kylix的source/internet下。同样建立WebService工程,将引用的ApacheApp改为ApacheTwoApp,但其他HTTPD2、ApacheTwoHTTP两个文件我没有用到。compile工程编译通过,Build会有警告:
[Warning] xdom.pas(16372): Error converting locale string 'im fentlichen Dokument ' to Unicode. String truncated. Is your LANG environment variable set correctly?
不知该警告是否影响到Apache无法装载该模块?
copy生成的libhelloWorldP.so到apache2的modules目录下,修改conf目录下的http.conf文件,加入如下文字:
LoadModule helloWorld_module modules/libhelloWorldP.so
<Location /helloWorld2>
SetHandler libhelloWorldP-handler
</Location>
重起apache服务,报错:“../bin/apachectl: line 100: 5162 Segmentation fault $HTTPD -k $ARGV”
看到有帖子讲要修改HTTPD2.pas文件,但我没有引用该文件,还是试了一下
MODULE_MAGIC_NUMBER_MAJOR = 20020612;这句注释掉,改为
MODULE_MAGIC_NUMBER_MAJOR = 20020903; { Apache 2.0.51..54 }
MODULE_MAGIC_NUMBER_MINOR = 1;这句注释掉,改为
MODULE_MAGIC_NUMBER_MINOR = 9;
conn_rec = {$IFDEF LINUX}packed{$ENDIF} record这句之前加了
ap_conn_keepalive_e = (AP_CONN_UNKNOWN, AP_CONN_CLOSE, AP_CONN_KEEPALIVE);
找到
(** Are we still talking? *)
flags: Cardinal;
{ The following are in the flags bitset:
unsigned aborted:1;

(** Are we going to keep the connection alive for another request?
* -1 fatal error, 0 undecided, 1 yes *)
signed int keepalive:2;

(** have we done double-reverse DNS? -1 yes/failure, 0 not yet,
* 1 yes/success *)
signed int double_reverse:2;
}
这一段,改为:
(** Are we still talking? *)
flags1: Cardinal;
{ The following are in the flags bitset:
unsigned aborted:1; }

(** Are we going to keep the connection alive for another request?
* @see ap_conn_keepalive_e *)
keepalive: ap_conn_keepalive_e;
还是不行,请各位大侠指教
小弟刚刚注册,没有分送,见谅
 
没人看到吗?自己顶上去
是否和linux环境有关,我用的是Red Hat Enterprise Linux 3.0
或Apache版本有关?2.0.53和1.3.33我都试过,都不行
 
没用过linux下的,帮你up一下
 
多谢豆豆糖道义上的支持
我现在重装linux,其他所有服务都不装(包括什么GNOME和KDE)
从另外一台装了kylix的机器编译(该机器是按默认安装安装了大部分linux的服务,包括自带的apache2.0.X),为了编译DSO,特意下载apache2.0.53源码安装(为了生成libhttpd.so文件)。编译后copy到第一台机器上,现在是可以LoadModule,apache服务也起来了,但是WSDL无法访问。如打开浏览器,输入192.168.2.222(第一台机器IP)/helloWorld2,找不到网页。
修改helloWorld.pas,在Application.Initialize;后加入代码:
ModuleName:='helloWorld_module';
ContentType:= 'helloworldp-handler';

把httpd.conf文件修改
<Location /helloWorld2>
SetHandler libhelloWorldP-handler
</Location>
--------------------
修改为:
<Location /helloWorld2>
SetHandler helloworldp-handler
</Location>
现象依旧,现在我准备尝试apache2.0.43
请大家关注一下,谁做过指教一下
是否跟编译环境有关?我编译的机器是默认安装了apache的,不是源码编译而是rpm包。编译后copy到192.168.2.222上,是否编译的环境不对,导致无法访问?
 
现在For Apache1的WebService跑起来了
原来我发现在httpd.conf中有一句ClearModuleList,我把它注释掉了
192.168.2.222/helloWorld2可以访问。
由于该机器没有装kylix3,所以还要如下文件:
libxercesxmldom.so.1
libxerces-c1_6_0.so
libicuuc.so.20
libicudt20l.so
现在可以了,不知道对中文支持如何,而且还要尝试apache2
 
现在的问题是:我本来的一个软件是三层结构的,我的WebService要连该软件的中间层,调用它的接口,通过中间层和数据库打交道,WebService不直连数据库。目前还有问题,调用接口无法返回应得的结果

现在问题
1.WebService无法连接中间层,(通过CORBA,网上下载的开放源码的ORB),一创建ORB对象就出错,为此我在kylix上新建一工程Application,作为客户端去连接中间层,则可以连接
2.传输层数据格式的问题,linux上格式如返回值为Olevariant的通过ORB不能正确传输,要转化为String
第一个问题比较急迫解决,为什么Application中调用中间层正常,WebService确不行
 
现在通过CORBA连接中间层已连通,但是返回的中文为乱码

我现在的结构是:客户端为浏览器-->Web服务器-->WebService-->中间层服务器-->数据库
其中的WebService一层最好用linux,但是目前面临两个问题:
1.调用中间层服务器接口,返回类型为Olevariant时,有错误;
2.返回的中文有乱码。
如果WebService尝试用Windows,则第一个错误不存在,但仍有第二个错误

因为我的“Web服务器”这一层是跑在linux上,用PHP写的,通过“nusoap.php”连接WebService。初步怀疑与nusoap有关,跟Web服务的配置是否有关?

---------------------------------------------
我试了一下,用delphi做客户端,调用WebService,返回的中文正确,Web配置应不会有问题。
估计和nusoap有关。我粗略看了nusoap.php代码,它的Encoding是utf-8,不知是否编码的原因,我要好好查一下资料,哪位大侠帮我看看
----------------------
乱码问题已解决,WebService中默认的Encoding不知是什么,用gb2312就可以了,奇怪的是以前我曾尝试过utf-8,GB2312,gb2312,都不行,这次死马当活马医居然好了。

也就是说现在WebService跑在windows上没有问题了(最多就是一些细节的东西);跑在linux上还有前面说的第一个错误:调用中间层服务器接口,返回类型为Olevariant时,有错误;
在linux上,传输层传递Olevariant类型数据,需转化成String;接收后再转化成Olevariant,我也这么做了,但是还是不成功,比较郁闷
问题到这一步与WebService已没有关系了。
盼众大侠援手
 
顶部