當我用我的客戶端調用SOAP方法時,我有一個非常有趣的問題,我必須傳遞一個類型爲Array_Of_Int(Array_Of_Int = Integer數組)的參數,問題是當數組正在在請求生成,它會生成以下在SOAP客戶端的Array_Of_Int
<ArrayParam>
<item>12345</item>
<item>23456</item>
<item>34567</item>
</ArrayParam>
,但我相信,服務器預期
<ArrayParam>12345</ArrayParam>
<ArrayParam>23456</ArrayParam>
<ArrayParam>34567</ArrayParam>
我敢肯定,德爾福有莫名其妙的RegisterSerializeOptions或RegisterInvokeOptions針對此問題的解決辦法,但是我似乎無法找到問題,想法?
謝謝大家的時間,我用Delphi 2010
編輯:爲了解決這個問題,因爲布諾提到的,我們必須產生的初始化部分添加以下代碼。 PAS文件:
InvRegistry.RegisterInvokeOptions(TypeInfo(<ServerInterfaceNameHere>), ioDocument);
然而強加的另一個問題,命名空間,作爲一個快速,漂亮優雅的修復,我已經添加在THTTPRIO的OnBeforeExecute方法如下代碼
procedure TMyDataModule.MyRioBeforeExecute(const MethodName: string; SOAPRequest: TStream);
procedure FixNamespaces;
var
LStrings: TStringList;
begin
LStrings := TStringList.Create;
try
SOAPRequest.Position := 0;
LStrings.LoadFromStream(SOAPRequest);
SOAPRequest.Position := 0;
SOAPRequest.Size := 0;
LStrings.Text := StringReplace(LStrings.Text, MethodName, 'NS1:' + MethodName, [rfReplaceAll]);
LStrings.Text := StringReplace(LStrings.Text, MethodName + ' xmlns', MethodName + ' xmlns:NS1', []);
LStrings.SaveToStream(SOAPRequest);
SOAPRequest.Position := 0;
finally
FreeAndNil(LStrings);
end; // tryf
end; // procedure FixNamespaces;
begin
FixNamespaces;
end;
以上是只是修復,我真希望我能找到一個更清潔,優雅的解決這個問題,如果有誰知道,請確實張貼你的答案。
我不能確認沒有看到WSDL /架構,但基於你已發佈的修復,該服務可能期望請求/響應的命名空間不同於接口的命名空間。只有通過'RequestNS'和'ResponseNS'屬性才能將此支持添加到Delphi/XE中,進口商將在這些情況下爲每種方法生成該屬性。在Delphi XE之前,唯一的方法是通過BeforeExecute事件(如上所述)或通過在不同名稱空間中註冊接口。如果一個方法預期ns1而另一個預期ns2,則後者不起作用。 – BruneauB 2011-02-25 18:09:55
我真的很失望,因爲我們沒有靈活性(IMO)就如何提出SOAP請求,例如,如果某些屬性,註冊等將來可以解決,我不希望手動執行如此微不足道的操作下一個德爾福版本XE2,超級XE)我將需要至少審查每一個請求,以確保它的工作正常(這在某種程度上反對RAD的想法...),此外,我不會感到驚訝,如果支持將下降明年發佈...反正客戶對WSDL非常嚴格(不能公開[!])。非常感謝您支持Bruneau。 – ComputerSaysNo 2011-02-25 20:35:14
我同意你關於缺乏靈活性。將SOAP綁定到RTTI的最初計劃是基於SOAP編碼規則進行的。隨着標準切換到XML編碼,很明顯這是一個不幸的決定,因爲XML編碼比RTTI編碼需要更多的靈活性/定製: – BruneauB 2011-02-25 21:49:26