delphi调用C# WEB服务,参数传递问题 ,转

所属分类:.NET技术 Web Services

----------------------------------------------------------------------

服务端:

public NetDiskWebSrv () {

//如果使用设计的组件,请取消注释以下行

//InitializeComponent();

}

[WebMethod]

public string HelloWorld() {

return "Hello World";

}

[WebMethod]

public void RegistServerInfo(string GUID,string strCompanyName,string strSoftVersion,string strHostIP)

{

//----------------------------------------

string strSQL = "select * from NetDiskServerInfo Where GU+GUID+"’";

PubClass TmpPub = new PubClass();

try

{

if (TmpPub.RecordExist(strSQL))

{

strSQL = "update NetDiskServerInfo set CompanyName=’" + strCompanyName + "’,SoftVersion=’" + strSoftVersion + "’,";

strSQL = strSQL + "ServerUrl=’" + strHostIP + "’,UpdateTime=’" + DateTime.Now + "’ where GU + GUID + "’";

}

else

{

strSQL = "insert into NetDiskServerInfo ([GUID],CompanyName,SoftVersion,ServerUrl,UpdateTime)";

strSQL = strSQL + "values(’" + GUID + "’,’" + strCompanyName + "’,’" + strSoftVersion + "’,’" + strHostIP + "’,’" + DateTime.Now + "’)";

}

TmpPub.ExcuteSQL(strSQL);

}

finally

{

}

}

//------------客户端---

var

ProxySrv:NetDiskWebSrvSoap;

sGUID,sHost,sCompany,sVersion:widestring;

begin

sGUID:=edtGUID.Text;

showmessage(sGUID);

sHost:=edtstrHostIP.Text;

sCompany:=edtstrCompanyName.Text;

sVersion:=edtstrSoftVersion.Text;

ProxySrv:=(httpRIOMain as NetDiskWebSrv.NetDiskWebSrvSoap);

//ShowMessage(ProxySrv.HelloWorld);

try

// ProxySrv.RegistServerInfo(Pchar(sGUID),Pchar(sCompany),Pchar(sVersion),Pchar(sHost));

ProxySrv.RegistServerInfo(’sdfsdfsdf’,’sdfsdfsdf’,’eeee’,’dfsdfsdfdf’);

except

Application.MessageBox(’WEB服务调用失败!’, ’WEB服务调用提示’, MB_OK +

MB_ICONSTOP);

end;

----------------------------------------

服务端调试通过,调用HelloWorld正确

调用 RgistServerInfo时,传到服务端的参数都变成了null,将参数改成pchar类型,仍然失败.

求教大吓们...........

(开发环境:D7+VS2005)

----------------------------------------------------------------------

也就是D的字符串类型发到NET这边都变成了NULL?D不是要先引用WSDL文件的吗?引用下来的文件转成D的时候是什么数据类型的呢?

--------------------------------------------------------

是的,D到NET就变成null

引用WSDL文件后,文件参数类型为WIDESTRING

--------------------------------------------------------

哪你转换成WIDESTRING传下看行不行?

--------------------------------------------------------

试过,仍然不行

--------------------------------------------------------

问题已解决,方法如下:

这是因为VS2005 默认是用的 SoapDocumentProtocol而Delphi 是

使用的 SoapRpcProtocol.这会造成所以客户端传过去的字符串变

了null.现在一般的做法是

在DELPHI的 INITIALIZATION 部分加入下边的代码:

InvRegistry.RegisterInvokeOptions(TypeInfo(这里是你的接口

名), ioDocument);

--------------------------------------------------------

在INITIALIZATION 部分加上一句:

InvRegistry.RegisterInvokeOptions(TypeInfo(ServiceSoap), ioDocument);

--------------------------------------------------------

学习

--------------------------------------------------------