zoukankan      html  css  js  c++  java
  • 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字眼)

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

  • 相关阅读:
    创建与合并分支
    Git丢弃本地修改
    《人月神话》小记
    财商培养
    赚钱有道,增加睡后收入
    学点经济学,升级认知
    保险小白普及知识
    管理决策、资源分配的最理想状态
    AI时代做一个终身学习者
    基于需求的测试
  • 原文地址:https://www.cnblogs.com/enjoyprogram/p/3263920.html
Copyright © 2011-2022 走看看