c++builder向c#开发的webservice传递非数字参数

一、引用WebService地址

BCB6.0环境下,File-New-Other-WebService-WSDL Importer。然后手动写完整地址。如:“http://192.168.1.3:1234/UpdateService.asmx?WSDL”。一路“下一步”之后,可以发现自动增加了UpdateService.cpp和UpdateService.h两个文件,保存。

UpdateService.h中webservice接口及参数设置如下:

__interface INTERFACE_UUID("{650CB923-0260-F472-915C-507FBAE06BF6}") UpdateServiceSoap : public IInvokable

{

public:

  virtual AnsiString      GetURLAddres() = 0;  virtual AnsiString      GetTheLastUpdateTime(const AnsiString sDownLoadFiles) = 0;

 virtual AnsiString      GetUpdateFiles(const  AnsiString sDownLoadFiles) = 0;

};

二、在程序主窗体中添加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,下拉菜单选中 http://192.168.1.3:1234/UpdateService.asmx?WSDL

2,Service,下拉菜单选中 UpdateService

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

三、添加引用

1,添加头文件

在窗体Form1.h文件里

添加UpdateService1.h的头文件。

2,声明

public:        // User declarations

          String sUrl,sPreFileNames;

          AnsiString sTmpDwnFilesDir;

        __fastcall TForm1(TComponent* Owner);

         _di_UpdateServiceSoap FUpdateService;

        _di_UpdateServiceSoap GetUpdateServiceSoap();

__property

        _di_UpdateServiceSoap UpdateService1={ read =GetUpdateServiceSoap};

 

  

 

3,在主程序的cpp中添加引用

 _di_UpdateServiceSoap TForm1::GetUpdateServiceSoap()

{

    if(!FUpdateService)

    {

        HTTPRIO1->QueryInterface(FUpdateService);

    }

    return  FUpdateService;

}

调用webservice方法:

  sUpdateTime = UpdateService1->GetTheLastUpdateTime(sTmpDwnFilesDir) ;

         sPreFileNames = UpdateService1->GetUpdateFiles(sTmpDwnFilesDir);

运行程序后返回的值始终不对,但用c#做的客户端就返回正确,确定是bcb这的问题,经上网搜索,是字符集的问题。包括我们可能会发现只能传数字,不能传中英文的参数,原因很简单,字符集不一致,导致服务器收到了乱码参数,而不是收不到参数。 那么我们需要做3部分工作来完成对字符集的调整。

1,UpdateService1.cpp里,

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

//        rio -> HTTPWebNode -> UseUTF8InHeader  =   true ;     rio -> Converter -> Options << soUTF8InHeader;      //

2,还是在UpdateService1.cpp里,

 

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

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

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

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

 如上修改后参数能被正确传递,并能正确返回结果值。

 

你可能感兴趣的:(webservice)