-ottenere quotazioni in InnerXml per andare sul filo come "
Versione corta (avviso miscela diabolica di XML e la codifica dei caratteri gratuita di seguito.): Perché non posso ottenere la mia chiamata riferimento al servizio (C# , .net 3.5, codice di riferimento del servizio automagic aggiunto a VS2008) per codificare correttamente un parametro che dovrebbe essere simile al filo: (cercare i bit "
... quelli sono la mia rovina.)
(altro extra bit di sapone rimossi per chiarezza)
<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>
Impostare il parametro, effettuare la chiamata ... e il servizio restituisce un messaggio carino che dice "NO SOU-- SOAP FOR YOU!"
Ho provato diversi altri formati nella mia stringa parametro passato-to-the-webservice:
action=\"add\"
che mi ha dato questo sul filo (via violinista): action="add"
action="add"
che ha dato me questo sul filo: action=&quot;add&quot;
e varie combinazioni (action = "" aggiungi ""!!) con html.encode, url.encode che praticamente non completa bombardato, o mostrato come doppi apici sul filo.
Oh, e ho anche provato <![CDATA["]]
circostante. Neanche questo ha funzionato.
C'è un modo per forzare una codifica a virgolette doppie nel bit innerHtml del messaggio soap?
* (perché è così che il servizio li vuole non fare domande questi non sono i droidi che stai cercando..)
* * * lungo, tortuoso versione:
Sto scrivendo un'app per automatizzare alcune procedure attualmente gestite da un'app di GUI amministrativa (winform). (In realtà, si tratta di uno snap-in MMC in. ogni modo.)
per compiere è compiti, l'applicazione di WinForm comunica con i suoi server tramite chiamate di servizio Web standard.
Sto usando il simpatico dispositivo di generazione automatica di riferimento del servizio web VS2008 (questa è la descrizione tecnica) e sono stato autenticato correttamente con il servizio Web . Per assicurarmi che stavo facendo le cose correttamente, ho catturato le chiamate dall'app GUI e poi le ho confrontate con quello che stavo inviando su il filo. Tutto andava bene. Poi mi sono imbattuto nei mali della e commerciale.(Più correttamente, come fare le cose per codificare correttamente)
Per una delle chiamate, il servizio web si aspetta di vedere qualcosa di simile: (ho catturato l'applicazione invio di questa via violinista)
<?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>
Estrarre tutte le informazioni SOAP-y extra per mostrare il bit pertinente: questa è la sezione <xmlData>
che viene trasmessa. Notare le "
che circondano i parametri:
<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>
Nel mio codice, ho una stringa di costruito in questo modo:
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>";
Quando la mia app invia fuori sopra il filo, violinista cattura questo: (ancora una volta , escludendo tutte le cose SOAP)
<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>
E il servizio ricevente invia un errore che non piace. Vuole il "
d ## nit.
Le parentesi angolari vengono codificate correttamente, ma le virgolette sono valide nella stringa HTTP e non vengono codificate.
"Ah-ha!" Dice I, "Presterò solo manualmente le cose!". Ho tentato di fare qualcosa di simile:
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>";
che è stata inviata come (ancora una volta, via violinista) e tutti i miei e commerciali (nel "
) vengono convertiti a &quot;
in questo modo:
<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>
E, come puoi immaginare, il servizio web di ricezione è tornato con "BZZT! Grazie per aver giocato!".
Ho provato tutti i tipi di sequenze di escape e codifica con risultati simili. Effettivamente, dopo tutta la mia manipolazione passa attraverso qualcosa come HttpUtility.HtmlEncode a destra prima di uscire sul filo, e qualsiasi e commerciale nella stringa viene convertito in &
. E le virgolette (singole o doppie) vengono ignorate nella conversione. E il servizio web di ricezione vuole quelle citazioni rappresentate come "
doggone, o sta andando a prendere la sua palla e andare a casa.
mia ultima, disperata speranza era quella di catturare il messaggio giusto (ho pensato) prima è andato sul filo utilizzando IClientMessageInspector to implement message inspection in caso BeforeSendRequest ... e manualmente impostato quelle cose prima è andato al filo.
Cattura bene il messaggio. Posso anche inserire manualmente "
.
Ma quando viene inviato, sia wirehark che violinista mi assicurano che sta uscendo ben formattato ... con le virgolette che cerco disperatamente di eliminare.
<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>
Sono alla fine del mio ingegno. Accetterò qualsiasi suggerimento fino al sacrificio compreso [piccola cosa coccolona] sulla modifica di [divinità vile] o vendendo lo stesso la mia collezione [collezione cuore anime/cuore/figlio]. Fidati di me, sarebbe il male minore.
Per richiesta qui di seguito, ecco lo stub messaggio generato: (I che questo è quello che stavi chiedendo ...)
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;
}
Ed ecco come è sempre chiamato:
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);
}
Il problema è: " ..." ... 'è un XML perfettamente valido. Sebbene non sia vietato, le virgolette non devono essere sfuggite nei nodi di testo XML. Il tuo servizio web non parla XML standard se non gli piace. –
dtb
Hai perfettamente ragione ~ sono perfettamente validi. Ma ci dovrebbe essere un modo per me di mettere " sul filo ... giusto? (oh, e sfortunatamente non è il mio servizio web ... oh, ma se fosse ...!) :) –
C'è un modo. Puoi risolvere ogni aspetto di WCF e sostituire parti con le tue implementazioni ... Puoi mostrarci la dichiarazione del metodo generato e come la stai chiamando? Ho un'idea per una soluzione semplice ma ho bisogno di controllare. – dtb