C++Builder6.0调用C#的WebServcie

由于特殊需要,客户端软件用BCB6.0做起来方便点。过程需要调用一个C#写的WebService。这里记录下试验过程供大家参考指教。废话少说,直入主题:

一、引用WebService地址

BCB6.0环境下,File-New-Other-WebService-WSDL Importer。这里的地址,需要注意下。因为我们在.NET环境下,比如用C#写客户端调用WebService,直接引用地址就可以了。比如格式为“http://111.111.111.111:1234”(剩余的,编译器会帮你填写完整),而在这里,BCB环境下,我们需要手动写完整地址。如:“http://111.111.111.111:1234/AlexService.asmx?WSDL”。一路“下一步”之后,我们可以发现AlexService.cpp和AlexService.h两个文件,保存。

二、添加THTTPRIO控件

这个控件的作用是

THTTPRIO uses HTTP messages to call remote interfaced objects using SOAP.

Use THTTPRIO to generate statically-linked calls to invokable interfaces on a remote Web Service application.

里面有几个属性设置下

从下面一个属性开始

1,WSDLLocation,下拉菜单选中

2,Service,下拉菜单选中

3,Port,下拉菜单选中,这里有2个选项,一个是ABCDWebServiceSoap和ABCDWebServiceSoap12,我们选中第一个。(因为BCB6.0还不能很好支持WebServiceSoap12)

三、添加引用

1,添加头文件

在窗体Form1.h文件里

添加AlexService.h的头文件。

2,声明

class TForm1 : public TForm

{

__published: // IDE-managed Components

TEdit *Edit1;

TEdit *Edit2;

TLabel *Label1;

TLabel *Label2;

TButton *Button1;

THTTPRIO *HTTPRIO1;

void __fastcall Button1Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

_di_AlexServiceSoap FAlexService;

_di_AlexServiceSoap GetAlexServiceSoap();

__property

_di_AlexServiceSoap AlexService={ read =GetAlexWebServiceSoap};

};

3,引用

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

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

_di_AlexServiceSoap TForm1::GetAlexServiceSoap()

{

if(!FAlexService)

{

HTTPRIO1->QueryInterface(FAlexService);

}

return FAlexService;

}

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

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if(AlexService)

{

Logon *pLogon ;

pLogon = (Logon*)AlexService->Client_LogOn("李福伟","Alex") ;

if(pLogon->bolLogOn == True)

{

ShowMessage("登录成功");

//pLogon->strCompany=? 这里是结构体的其他内容

//pLogon->iUid=?

}

else

ShowMessage("登录失败");

}

}

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

以上就是做了一个用户登录的接口演示,要注意的是,我这里登录返回的不是一个单纯bool值,而是一个结构体。很多人在C++调用包含结构体函数的C#的WebService时候会有问题,这里也刚好演示到了。

三,支持传参

以上算是基本完成了BCB环境下对C#的WebService的调用了,但是大家可能会发现,服务器依旧收不到传过来的函数参数。比如AlexService->Client_LogOn("李福伟","Alex")这里,两个参数传不进到服务器。有人会怀疑 了,是否通讯上出了什么问题呢?权限?防火墙?呵呵,大家别想歪了。这次是字符集的问题。包括我们可能会发现只能传数字,不能传中英文的参数,原因很简单,字符集不一致,导致服务器收到了乱码参数,而不是收不到参数。 那么我们需要做3部分工作来完成对字符集的调整。

1,AlexService.cpp里,

THTTPRIO* rio = new THTTPRIO(0);的后面,加上以下两句话:

//

rio->HTTPWebNode->UseUTF8InHeader = true;

rio->Converter->Options<<soUTF8InHeader;

//

2,还是在AlexService.cpp里,

static void RegTypes(){这个函数的最后,我们需要加上下面一段话}

InvRegistry()->RegisterInvokeOptions(__interfaceTypeinfo(AlexServiceSoap), ioDocument);

3,调整THTTPRIO控件的字符集调整

这个控件的属性有两处关于utf8的bool值,请都改成true就可以了。(那2处都很好找,属性名就有utf8字眼)

至此,BCB6.0环境下,对C#的Webservice的调用,完成。

如有建议或者疑问,欢迎大家邮件给我。