तार पर जाने के लिए -innerXML में हो रही उद्धरण के रूप में "
लघु संस्करण (चेतावनी एक्सएमएल और नीचे अनावश्यक वर्ण एन्कोडिंग का अपवित्र मिश्रण।): मैं क्यों नहीं कर सकते हैं मेरी सेवा संदर्भ कॉल (ग # , .NET 3.5, ऑटोमैजिक सेवा संदर्भ कोड VS2008 में जोड़ा गया है) इस पैरा को ठीक तरह से पैरामीटर को एन्कोड करने के लिए: ("
बिट्स देखें ... वे मेरे हैं।)
(अन्य अतिरिक्त साबुन-वाई बिट्स स्पष्टता के लिए हटा दिए गए हैं)
<SOAP-ENV:Body><SOAPSDK4:SetCondition xmlns:SOAPSDK4="http://tempuri.org/message/">
<sharedSecret>buggerall</sharedSecret>
<xmlData><SEARCHINFO_LIST><SEARCH_INFO action="add" status=&
quot;3" name="TestProfile2" mask="0" campaign_id="33"
campaign_protected="N" condition_protected="N"><CONDITIONS/&
gt;<EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST></xmlData>
</SOAPSDK4:SetCondition></SOAP-ENV:Body>
मैंने पैरामीटर सेट किया है, कॉल करें ... और सेवा एक अच्छा संदेश देती है "कोई सूओ - आपके लिए साबुन!"
action=\"add\"
जो मुझे तार पर यह दिया (Fiddler के माध्यम से): action="add"
action="add"
जो दिया
मैं अपने से पारित कर दिया करने के लिए-वेब सेवा पैरामीटर स्ट्रिंग में कई अन्य स्वरूपों की कोशिश की मुझे यह तार पर: action=&quot;add&quot;
और विभिन्न संयोजन (action = "" add ""?!) html.encode, url.encode के साथ जो बहुत अधिक पूर्ण हो गया है ly bombed, या तार पर डबल उद्धरण के रूप में दिखाया।
ओह, और मैंने आसपास भी <![CDATA["]]
की कोशिश की। वह या तो काम नहीं किया।
क्या साबुन संदेश के आंतरिक HTML बिट में डबल कोट एन्कोडिंग को मजबूर करने का कोई तरीका है?
* (क्योंकि है कि कैसे सेवा उन्हें चाहता है सवाल पूछने नहीं है इन ड्रौयड आप देख रहे हैं नहीं कर रहे हैं।।)
* * * लांग, कुटिल संस्करण:
मैं कुछ प्रक्रियाओं को स्वचालित करने के लिए एक ऐप लिख रहा हूं जो वर्तमान में ए (विनफॉर्म) प्रशासनिक जीयूआई ऐप द्वारा संचालित हैं। (असल में, यह एक एमएमसी स्नैप है। वैसे भी।)
अपने कार्यों को पूरा करने के लिए, Winform ऐप मानक वेब सेवा कॉल के माध्यम से इसके सर्वर के साथ संचार करता है।
मैं वीएस -2008 की निफ्टी "वेब सेवा संदर्भ" ऑटो पीढ़ी की चीज़ (यह तकनीकी विवरण है) का उपयोग कर रहा हूं, और मैंने सफलतापूर्वक वेब सेवा को प्रमाणित किया है। यह सुनिश्चित करने के लिए कि मैं चीजों को सही तरीके से कर रहा था, मैंने GUI ऐप से कॉल पर कब्जा कर लिया, और फिर उनसे तुलना की जो मैं तार पर भेज रहा था। सब अच्छा था। तब मैं एम्परसैंड की बुराई में भाग गया।
<?xml version="1.0" encoding="UTF-8" standalone="no"?><SOAP-ENV:Envelope
xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" xmlns:SOAPSDK2="
http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3="
http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="
http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAPSDK4:SetCondition
xmlns:SOAPSDK4="http://tempuri.org/message/"><sharedSecret>0500001007C3525F3-F315-460D-
AF5C-D84767130126094</sharedSecret><xmlData><SEARCHINFO_LIST><SEARCH_INFO
action="add" status="3" name="TestProfile2" mask=&
quot;0" campaign_id="33"campaign_protected="N"
condition_protected="N"><CONDITIONS/><EXPRESSIONS/>&
lt;/SEARCH_INFO></SEARCHINFO_LIST></xmlData></SOAPSDK4:SetCondition></SOAP-
ENV:Body></SOAP-ENV:Envelope>
(मैं एप्लिकेशन Fiddler के माध्यम से इस भेजने पर कब्जा कर लिया): (अधिक ठीक से, कैसे चीजें ठीक से एन्कोड करने के लिए प्राप्त करने के लिए)
कॉल में से एक के लिए, वेब सेवा कुछ इस तरह देखने के लिए उम्मीद
प्रासंगिक बिट दिखाने के लिए सभी अतिरिक्त SOAP-y सामग्री को बाहर निकालना - यह <xmlData>
अनुभाग है जो पारित हो गया है। सूचना "
मापदंडों आसपास:
var serviceParams = "<SEARCHINFO-LIST><SEARCH_INFO action=\"add\"
status=\"3\" name=\"TestProfileFromExternApp\" mask=\"0\" campaign_id=\"33\"
campaign_protected=\"N\"
condition_protected=\"N\"><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>";
मेरे ऐप तार पर इसे बाहर भेजता है, तो Fiddler इस कब्जा: फिर से (
<SEARCHINFO_LIST><SEARCH_INFO action="add"
status="3" name="TestProfile2" mask="0"
campaign_id="33" campaign_protected="N"
condition_protected="N"><CONDITIONS/><EXPRESSIONS/>&
lt;/SEARCH_INFO></SEARCHINFO_LIST>
मेरे कोड में, मैं एक स्ट्रिंग तो तरह का निर्माण किया है , सभी सोप सामान बाहर अलग करना)
<SEARCHINFO-LIST><SEARCH_INFO action="add" status="3"
name="TestProfileFromExternApp" mask="0" campaign_id="33"
campaign_protected="N" condition_protected="N"><CONDITIONS/>
<EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>
और प्राप्त सेवा वापस है कि यह यह पसंद नहीं करता एक त्रुटि भेजता है। यह "
डी ## नाइट चाहता है।
कोण ब्रैकेट ठीक से एन्कोड किए जाते हैं, लेकिन उद्धरण HTTP स्ट्रिंग में मान्य हैं, और एन्कोडेड नहीं होते हैं।
"आह-हा!" मैं कहता हूं, "मैं सिर्फ चीजों को मैन्युअल रूप से एन्कोड कर दूंगा!"। मैं करने का प्रयास किया कुछ इस तरह करते हैं:
var serviceParams = "<SEARCHINFO-LIST><SEARCH_INFO action="add"
status="3" name="TestProfileFromExternApp"
mask="0" campaign_id="33"
campaign_protected="N"
condition_protected="N"><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>";
कौन सा रूप में बाहर भेजा गया था (फिर से, Fiddler माध्यम से) और मेरे सारे एम्परसेंड्स ( "
में) ताकि तरह &quot;
परिवर्तित हो:
<SEARCHINFO-LIST><SEARCH_INFO action=&quot;add&quot;
status=&quot;3&quot;
name=&quot;TestProfileFromExternApp&quot; mask=&quot;0&quot;
campaign_id=&quot;33&quot; campaign_protected=&quot;N&quot;
condition_protected=&quot;N&quot;><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>
और, जैसा कि आप अनुमान लगा सकते हैं, प्राप्त करने वाली वेब सेवा "BZZT! के साथ वापस आ गई है!"।
मैंने सभी प्रकार के भागने और समान परिणामों के साथ अनुक्रमों को एन्कोड करने का प्रयास किया है। प्रभावी रूप से, मेरे सभी मैनिपुलेशन के बाद यह HttpUtility.HtmlEncode तार 0 से बाहर जाने से पहले और किसी भी स्ट्रिंग में एम्पर्सेंड &
में परिवर्तित हो जाता है। और उद्धरण (एकल या डबल) रूपांतरण में अनदेखा कर रहे हैं। और प्राप्त करने वाली वेब सेवा चाहता है कि उन उद्धरण "
कुत्ते के रूप में प्रदर्शित किए गए हैं, या यह पर जा रहा है और यह घर पर जाएं।
मेरे पिछले हताश आशा उन चीजों को सेट करने से पहले इसे तार के पास गया संदेश सही (मैंने सोचा) को पकड़ने के लिए इससे पहले कि यह BeforeSendRequest घटना में IClientMessageInspector to implement message inspection का उपयोग कर तार पर चला गया था ... और मैन्युअल।
मैं संदेश को ठीक से कैप्चर करता हूं। मैं मैन्युअल रूप से "
में भी डाल सकता हूं।
लेकिन जब यह भेजा जाता है, तो वायरसहार्क और फिडलर दोनों मुझे आश्वस्त करते हैं कि यह अच्छी तरह से स्वरूपित हो रहा है ... उद्धरण के साथ मैं छुटकारा पाने की कोशिश कर रहा हूं।
<xmlData xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SEARCHINFO-LIST><SEARCH_INFO action="add" status="3"
name="TestProfileFromExternApp" mask="0" campaign_id="33" campaign_protected="N"
condition_protected="N"><CONDITIONS/><EXPRESSIONS/>
</SEARCH_INFO></SEARCHINFO_LIST></xmlData>
मैं अपने wits अंत में हूँ। मैं [छोटे cuddly बात][vile देवता] के बदले या मेरे [आत्मा/दिल/बेटे के बायोनैक संग्रह] को बेचने के लिए किसी भी सुझाव को स्वीकार करूँगा। मेरा विश्वास करो, यह कम बुरा होगा।
नीचे अनुरोध के अनुसार, यहां उत्पन्न संदेश ठूंठ है:
public int SetCondition(string sharedSecret, string xmlData, out string resultValue)
{
tzGui.tzCampaign.SetConditionRequest inValue = new tzGui.tzCampaign.SetConditionRequest();
inValue.sharedSecret = sharedSecret;
inValue.xmlData = xmlData;
tzGui.tzCampaign.SetConditionResponse retVal = ((tzGui.tzCampaign.CampaignSoapPort)(this)).SetCondition(inValue);
resultValue = retVal.resultValue;
return retVal.Result;
}
(मुझे लगता है कि यह आप ... के लिए क्या पूछ रहे थे है) और यह इस प्रकार कहा जाता हो रही है:
void SetConditionTask()
{
//ok, now we *try* and create a new profile
var tzCampaignCxn = new tzCampaign.CampaignSoapPortClient("CampaignSoapBinding");
//no worky
//string xmlData = "<SEARCHINFO-LIST><SEARCH_INFO action=\"add\" status=\"3\" name=\"TestProfileFromExternApp\" mask=\"0\" campaign_id=\"33\" campaign_protected=\"N\" condition_protected=\"N\"><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>";
//this one doesn't work
//string xmlData = "<SEARCHINFO-LIST><SEARCH_INFO action=<![CDATA[ " ]]>add<![CDATA[ " ]]> status=<![CDATA[ " ]]>3<![CDATA[ " ]]> name=<![CDATA[ " ]]>TestProfileFromExternApp<![CDATA[ " ]]> mask=<![CDATA[ " ]]>0<![CDATA[ " ]]> campaign_id=<![CDATA[ " ]]>33<![CDATA[ " ]]> campaign_protected=<![CDATA[ " ]]>N<![CDATA[ " ]]> condition_protected=<![CDATA[ " ]]>N<![CDATA[ " ]]>><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>";
//this one doesn't either
string xmlData = "<SEARCHINFO-LIST><SEARCH_INFO action="add" status="3" name="TestProfileFromExternApp" mask="0" campaign_id="33" campaign_protected="N" condition_protected="N"><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>";
string createProfileResultVal = string.Empty;
tzCampaignCxn.SetCondition(SharedSecret, xmlData, out createProfileResultVal);
txtResults.AppendText(Environment.NewLine + Environment.NewLine + createProfileResultVal);
}
बात यह है: ' ..." ... 'पूरी तरह से मान्य एक्सएमएल है। हालांकि यह प्रतिबंधित नहीं है, डबल कोट्स को एक्सएमएल टेक्स्ट नोड्स में भागने की आवश्यकता नहीं है। यदि आपकी यह पसंद नहीं है तो आपकी वेब सेवा मानक एक्सएमएल नहीं बोलती है। –
dtb
आप बिल्कुल सही हैं ~ वे पूरी तरह मान्य हैं। लेकिन तार पर " डालने का मेरे लिए एक तरीका होना चाहिए ... सही? (ओह, और दुर्भाग्य से यह मेरी वेब सेवा नहीं है ... ओह, लेकिन अगर यह था ...!) :) –
एक रास्ता है। आप डब्ल्यूसीएफ के हर पहलू के साथ गड़बड़ कर सकते हैं और अपने स्वयं के कार्यान्वयन के साथ भागों को प्रतिस्थापित कर सकते हैं ... क्या आप हमें जेनरेट की गई घोषणा घोषणा और आप इसे कैसे कॉल कर रहे हैं? मुझे एक साधारण समाधान के लिए एक विचार है लेकिन मुझे जांच करने की ज़रूरत है। – dtb