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的调用,完成。

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





posted on 2011-04-20 16:32  李福伟  阅读(5171)  评论(3编辑  收藏  举报

导航