2010-05-11 50 views
4

我已經爲項目導入了一些wsdl。 我想改變HttpRio onBeforeExecute事件SoapRequest,但 當我改變了請求,我得到一些錯誤我怎麼能改變請求XML文件 stringReplace函數在這個事件。THttprio onBeforeExecute更改soapRequest

我試圖改變流的大小,我改變了編碼等,但無論如何它沒有工作。

例如

procedure TForm1.RiomBeforeExecute(const MethodName: string; SOAPRequest: TStream); 
var 
    sTmp         : TStringList; 

begin 

    sTmp:=TStringList.Create; 
    SOAPRequest.Position := 0; 
    sTmp.LoadFromStream(SOAPRequest); 
    sTmp.Text := StringReplace(sTmp.Text,'blablaa','bla',[RfReplaceAll]); 
    sTmp.SaveToStream(SOAPRequest); 
    // blaa blaa... 
end; 

回答

3
procedure TForm1.RiomBeforeExecute(const MethodName: string; SOAPRequest: TStream); 
var 
    sTmp         : TStringList; 

begin 

    sTmp:=TStringList.Create; 
    SOAPRequest.Position := 0; 
    sTmp.LoadFromStream(SOAPRequest); 
    sTmp.Text := StringReplace(sTmp.Text,'blablaa','bla',[RfReplaceAll]); 
    **SOAPRequest.Postion:=0**;// i forget this here, as i write the code that worked 
    sTmp.SaveToStream(SOAPRequest); 
    // blaa blaa... 
end; 
+3

是的!這將做到這一點。順便說一句,我也使用這種方法來修復損壞的名稱空間。這也是將SOAPRequest轉儲到日誌文件的好地方。 – 2010-05-11 23:14:27

5

可能增強......我才發現,我的情況(這是SOAP響應,順便說一句,如果它的事項),如果產生的請求是短比原來的(並且就你的情況而言),當新字符串被寫回到流中時殘留的殘留物。
例如:

original: <blablaa some stuff> 
intended: <bla some stuff> 
actual: <bla some stuff>uff> 

修正:

SOAPRequest.Postion:= 0; //這裏我忘記這一點,因爲我寫的起作用
SOAPRequest.size的代碼:=長度(STMP。文本); //重要 - 在保存之前設置新的長度。
sTmp.SaveToStream(SOAPRequest);

+0

:)是的,我也忘記了..謝謝你克里斯。 – adnanturken 2010-05-12 22:22:39