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 inte易做图ced objects using SOAP.
Use THTTPRIO to generate statically-linked calls to invokable inte易做图ces 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->QueryInte易做图ce(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(__inte易做图ceTypeinfo(AlexServiceSoap), ioDocument);
3,调整THTTPRIO控件的字符集调整这个控件的属性有两处关于utf8的bool值,请都改成true就可以了。(那2处都很好找,属性名就有utf8字眼)
至此,BCB6.0环境下,对C#的Webservice的调用,完成。如有建议或者疑问,欢迎大家邮件给我。
补充:软件开发 , C++ ,