2011-07-04 20 views
0

我已經對一個WCF服務進行了原型化,該服務有一個接收對象數組作爲單個參數的操作。麻煩的是,每個對象都從一個基類(稱爲Message)繼承而來,它們的順序並不知道在前面。起初,WCF接收的(不正確)是一個Message元素數組,而不是從Message派生的正確類型。從Delphi客戶端使用WCF(數組和繼承)

經過一番努力,我可以從Delphi 6.02中調用這個服務。我使用WSDL導入器來創建基本客戶端並手動編輯源代碼,以糾正與Delphi SOAP解釋不兼容的問題。基本上,我做一些調整在OnBeforeExecute事件,像這樣:

SOAPRequest := StringReplace(SOAPRequest, '<item ', '<Message ', [rfReplaceAll]); 

上面的代碼校正的Delphi傳遞數組元素的方式。我在這裏學到了Array_Of_Int in SOAP client

然後,每個對象編碼爲一個消息,但一個屬性點,其運行時類型:

<Message xsi:type="Authenticate"> <!-- I need to get this, exactly, types can vary --> 

的問題是,在這裏我們去,我還有其他種類的陣列。然後,可以用附件或地址來替換「項目」的發生。如果我將該類標記爲ioDocument,那麼我將基類作爲標記名,但通過屬性丟失了正確的類型。

任何想法來處理它?也許我可以使用其他SOAP庫?或者.NET能夠理解「項目」編碼?

謝謝。

+0

的http:// stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/#answer-1732454 –

回答

0

我設法使它工作,但不得不修改德爾福來源是這樣的:

{OPToSOAPDomConv.pas, around line 3001} 
procedure TSOAPDomConv.SetNodeType(RootNode, InstNode: IXMLNode; const ElemURI, 
    TypeName: InvString); 
var 
    Pre, AttNodePre: InvString; 
begin 
    if not (soSendUntyped in Options) /*and not (soDocument in Options)*/ then 
... 

這樣,一個對象guaranted出口的實際類型:

<Message xsi:type="Authenticate"> <!-- I need to get this, exactly, types can vary -->