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

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





转载于:https://www.cnblogs.com/lifw/archive/2011/04/20/2022443.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值