当前位置:编程学习 > C/C++ >>

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

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

 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,