C++Builder6.0調用C#的WebServcie

來源:互聯網
上載者:User

由於特殊需要,用戶端軟體用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的調用,完成。

如有建議或者疑問,歡迎大家郵件給我。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.