李福偉
由於特殊需要,客戶端軟件用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的調用,完成。
如有建議或者疑問,歡迎大家郵件給我。