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字眼)

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

  • 相关阅读:
    iOS开发中多线程断点下载大文件
    iOS开发中的压缩以及解压
    iOS中大文件下载(单线程下载)
    NSURLConnection的GetPost方法
    自定义NSOperation下载图片
    NSOperation和NSOperationQueue的一些基本操作
    虚函数、继承
    new、delete、以及queue类
    new、delete、以及queue类
    在构造函数中使用new时的注意事项
  • 原文地址:https://www.cnblogs.com/enjoyprogram/p/3263920.html
Copyright © 2011-2022 走看看