問題1:服務端接收的所有中文都是"?????"(亂碼)
解決:設定HTTPRIO控制項的HTTPRIO.HTTPWebNode.UserUTF8InHeader屬性為true
問題2:Dephi編寫的用戶端在windows2003下調用WebService提示"Access violation at address 00E59195. Write of address 00E59195"
解決:我的電腦屬性->進階->效能->設定->資料執行防止。選中"只為關鍵 Windows 程式和服務啟用資料執行防止。當然你可以選擇另一個選項,並添加我們的用戶端作為例外處理。有二點比較奇怪的,一、並不是每一台windows2003的機器都需要這樣設定;二、有問題的2003機器使用.net寫的用戶端卻能正常訪問WebService。
問題3:從服務端得到的XML字串,一分析就出錯
解決:先使用WideString變數儲存返回的XML字串。再利用這個變數分析。string不能識別分行符號。
問題4:服務端得到的參數都為空白值
解決:檢查一下引入的WebService單元的最後三行是否如下
initialization
InvRegistry.RegisterInterface(TypeInfo(YourWebServiceSoap), 'http://tempuri.org/', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(YourWebServiceSoap), 'http://tempuri.org/%operationName%');
InvRegistry.RegisterInvokeOptions(TypeInfo(YourWebServiceSoap), ioDocument);//這一行有時會沒有
end.
這一行 InvRegistry.RegisterInvokeOptions(TypeInfo(YourWebServiceSoap), ioDocument);有時候沒有的。舉個例子,當我們的WebService的其中一個方法有參數的類型為DataSet時,單元檔案的最後幾行是這樣的
initialization
InvRegistry.RegisterInterface(TypeInfo(YourWebServiceSoap), 'http://tempuri.org/', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(YourWebServiceSoap), 'http://tempuri.org/%operationName%');
RemClassRegistry.RegisterXSClass(GetDataSetResult, 'http://tempuri.org/', GetDataSetResult);
RemClassRegistry.RegisterXSClass(updateSet, 'http://tempuri.org/', 'updateSet');
end.
這時,服務端接收到的所有參數都為null;這裡你所手工在中間加入上面所提到的那一行。
問題5:服務端方法返回的DateTime,Delphi取得的時間不對。
解決:引用後,delphi是用TXSDateTime來接收C#的DateTime變數的。TXSDateTime有兩個屬性AsDateTime、AsUTCDateTime都是TDateTime,也就是Delphi用的日期變數了,但這兩個屬性得到的時間是不對的。放斷點可以觀察到TXSDateTime的年、月、時各變數都是正確的,所以解決的方式是取年月時分各變數重新組合成時間變數。
在這個過程,我碰到一個有趣的情況。看下面的C#代碼
[WebMethod(EnableSession=true)]
public DateTime MyTime()
{
DateTime cur = DateTime.Now;
return cur;
}
[WebMethod(EnableSession=true)]
public DateTime YourTime(DateTime pTime)
{
return pTime.AddDays(1);
}
Delphi調用後者,TXSDateTime中的AsDateTime屬性儲存的時間是對的。調用MyTime(),AsDateTime儲存的時間就不對! 我以為AsUTCDateTime的情況可能會有所不同,但其實這裡他與AsDateTime是一樣的。另外,.net能不能再做些什麼呢?我注意到.net的DateTime有這麼一個方法ToUniversalTime;我在MyTime中嘗試應用這個方法,結果更遭,delphi得到的年時分各變數的值不對了;期待AsUTCDateTime會給我驚喜,結果他還是與AsDateTime非常的一致;結果都不對。