2010-03-18 10 views
12

मैं एक ऐसे सिस्टम पर काम कर रहा हूं जो एक साबुन इंटरफेस प्रदान करता है। इंटरफ़ेस का उपयोग करने वाले सिस्टमों में से एक को डेल्फी 7 में कोड किया गया है। वेब सेवा डब्ल्यूसीएफ, मूल http बाध्यकारी, SOAP 1.1 के साथ विकसित की गई है।डेल्फी एसओएपी लिफाफा और डब्ल्यूसीएफ

यदि मैं SOAP UI (जावा) का उपयोग करता हूं, तो सेवा ठीक से काम करती है। लेकिन डेल्फी यहाँ विशेष काम करने के लिए लगता है,)

यह कैसे संदेश सोप यूआई में की तरह लग रहा है:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.xxx.de/xxx"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ser:GetCustomer> 
     <!--Optional:--> 
     <ser:GetCustomerRequest> <!-- this is a data contract --> 
      <ser:Id>?</ser:Id> 
     </ser:GetCustomerRequest> 
     </ser:GetCustomer> 
    </soapenv:Body> 
</soapenv:Envelope> 

मैं एक डेल्फी डेवलपर नहीं कर रहा हूँ, लेकिन मैं एक साधारण परीक्षण ग्राहक क्या हो रहा है देखने के लिए विकसित गलत। यह डेल्फी एसओएपी लिफाफा के रूप में भेजता है।)

Es wurde दास Endelement "द बॉडी" aus नाम स्थान "http://schemas.xmlsoap.org/soap/envelope/" erwartet;

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS2="http://services.xxx.de/xxx"> 
    <NS1:GetCustomer xmlns:NS1="http://services.xxx.de/xxx"> 
     <GetCustomerRequest href="#1"/> 
    </NS1:GetCustomer> 
    <NS2:GetCustomerRequest id="1" xsi:type="NS2:GetCustomerRequest"> 
     <Id xsi:type="xsd:int">253</Id> 
    </NS2:GetCustomerRequest> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

WCF एक त्रुटि जर्मन भाषा ... में है कि फेंकता है। Gefunden wurde "एलिमेंट" एनएस 2: GetCustomerRequest "ऑस नेमस्पेस" http://services.xxx.de/xxx ""। Zeile 1, स्थिति 599.

तरह

शारीरिक उम्मीद थी ही कुछ। लेकिन इसके बजाय एलिमेंट "एनएस 2: GetCustomerReques" पाया गया था।

अब मेरे प्रश्न हैं: क्या मैं किसी भी तरह से डेल्फी लिफाफा बनाता है? या ऐसे संदेश स्वरूपों के साथ डब्ल्यूसीएफ काम करने के तरीके हैं? कोई भी मदद बहुत ही सराहनीय होगी!

+1

समस्या एनएस 1 एनएस 2 हिस्सा नहीं है। समस्या यह है कि डेल्फी संरचनात्मक रूप से गलत एक्सएमएल बना रहा है। ऐसा लगता है कि वेब सेवा GetCustomerRequest को GetCustomer के अंदर घोंसला करने की उम्मीद कर रही है, लेकिन डेल्फी क्लाइंट GetCustomerRequest तत्व को घोंसला नहीं दे रहा है। मुझे नहीं पता कि इसे कैसे ठीक किया जाए। क्या आपने डब्लूसीएफ सेवा से डब्लूएसडीएल का उपयोग करके डेल्फी क्लाइंट उत्पन्न किया था? –

उत्तर

16

यहाँ क्या कुछ लोगों जिसका अर्थ हो सकता है, डेल्फी नहीं भेज रहा है अमान्य सोप लगते हैं के विपरीत, यह बस आरपीसी/एनकोड सोप भेज रहा है। सभी xsi:type विशेषताओं से पहचानना बहुत आसान है। आरपीसी/एनकोडेड डब्ल्यूएस-आई अनुरूप नहीं है लेकिन यह अभी भी वैध SOAP है।

WCF, डिफ़ॉल्ट रूप से, दस्तावेज़/शाब्दिक/लिपटा सोप प्रारूप है, जो डेल्फी 7 सर्वर साइड पर बिल्कुल भी संभाल सकते हैं का उपयोग करता है और आप क्लाइंट की तरफ कुछ समायोजन करने के लिए है।

सबसे आसान समाधान डेल्फी को दस्तावेज़/शाब्दिक शैली का उपयोग करने के लिए बस कहना है। THttpRio.Converter.Options में soLiteralParams को चालू करके आप ऐसा करते हैं। यह डेल्फी को आपके द्वारा देखे जा रहे पैरामीटर को "अनदेखा" नहीं करने के लिए कहता है। "दस्तावेज़" पहलू ऐसा कुछ है जो डेल्फी डब्लूएसडीएल आयातक आमतौर पर पता लगा सकता है ताकि आपको इसके बारे में चिंता करने की आवश्यकता न हो। ,

[ServiceContract] 
[XmlSerializerFormat(Style = OperationFormatStyle.Rpc, 
    Use = OperationFormatUse.Encoded)] 
public interface IMyService 
{ 
    // etc. 
} 

दूसरा क्योंकि अनुशंसित नहीं है के रूप में मैं उल्लेख किया:

अन्य समाधान सेवा करने के लिए निम्न विशेषताओं को जोड़कर आरपीसी/एनकोड शैली का उपयोग करने, आप कर सकते हैं जो WCF सेवा बताने के लिए है पहले, आरपीसी/एनकोडेड डब्ल्यूएस-आई अनुरूप नहीं है, लेकिन फिर भी अधिकांश एसओएपी टूलकिट इसे पहचानते हैं, इसलिए मैं इसे यहां एक संभावना के रूप में सूचीबद्ध करता हूं।

-1

डेल्फी और जावा ढांचे अलग-अलग नाम स्थान का उपयोग करते हैं। संगत अगर बनाने के लिए एक तरह से कच्चे एक्सएमएल रोकना और सभी "NS2" जो कुछ भी करने के लिए deserializer उम्मीद बदलने के लिए है

चीयर्स

+0

-1: मानकों के अनुरूप एसओएपी पार्सर के लिए, नाम स्पेस उपसर्ग सभी – mjn

3

मैं सिर्फ इनमें से किसी एक किया था, और मैं stringreplace कॉल की एक श्रृंखला के साथ समाप्त हो गया इन एक्सएमएल आउटपुट को इन-लाइन नेमस्पेस को पट्टी करने के लिए बदलने और इसे सोपूआई प्रारूप की तरह दिखने के लिए। हां ऐसा करने के लिए बहुत सारे मैन्युअल हैकिंग लेते हैं।

पूर्व:

आप रियो बनाने के बाद, अपनी खुद की BeforeExecute proc फोन:

... 
EEUPSERTRIO.OnBeforeExecute := self.RIO_BeforeExecute; 
... 

procedure TMyWrapper.RIO_BeforeExecute(const MethodName: string; var SOAPRequest: WideString); 
{ 
Since Delphi isn't very good at SOAP, we need to fix the request so that the namespaces are correct. 
Basically, you take what Delphi gives you and try it in SoapUI. 
If yours doesn't work and SoapUI's version does, make yours look like theirs. 
} 

... अब इन-लाइन नेमस्पेस को निकाल देते हैं:

SOAPRequest := StringReplace(SOAPRequest,' xmlns:NS1="http://services.xxx.de/xxx"','',[rfReplaceAll,rfIgnoreCase]); 

। .. इनमें से बहुत सारे।

फिर आप साबुन शीर्षलेख को उस स्थान से बदल देंगे जिसमें नामस्थान हैं जो आप चाहते हैं।

SOAPRequest := StringReplace(SOAPRequest,'xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns:ns1="http://services.xyzcorp.com/xyz/EnterpriseEmployeeService_1_0" '+'xmlns:ns1="http://schemas.xyzcorp.com/TLOIntegration_HRO_Preview/TLOIntegration_1_0" ',[]); 

तो फिर तुम अच्छे फिर से इंजेक्षन कर सकते हैं:

ReplaceTag(SOAPRequest,'<metaData>','ns1:'); 
    ReplaceTag(SOAPRequest,'<trackingId>','ns1:'); 
    ReplaceTag(SOAPRequest,'<srcSystem>','ns1:'); 

अंत में, आप आसानी से SoapUI साथ डबल्यूएसडीएल फिर से लगता है और यह एक mockservice की मेजबानी होने से अपने डेल्फी आउटपुट को कैप्चर कर सकते हैं।फिर अपने ऐप को एंडपॉइंट के रूप में इंगित करें, और यह आउटपुट कैप्चर करेगा।
या, आप अनुरोधों को कैप्चर करने के लिए फिडलर को प्रॉक्सी के रूप में उपयोग कर सकते हैं।

+0

FYI पर कोई फर्क नहीं पड़ता - हम D2007 से D2005 का उपयोग कर रहे थे। –

+2

डेल्फी नाइटपिक सूची में जोड़ा गया ... http://stackoverflow.com/questions/2112729/biggest-delphi-nitpicks/2473684#2473684 –

+0

निर्णय के लिए Thsnks। यह एक है, जो वास्तव में मदद की है –

संबंधित मुद्दे