程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++Builder6.0調用C#的WebServcie

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

編輯:C++入門知識

李福偉

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

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved