WCF: Utilizzare Apache WEB Service..
-
lunedì 2 aprile 2012 15:12
Ciao a tutti, mi è stato chiesto di utilizzare un web service hostato in Apache (2.0 credo). Ho aggiunto la service reference all'url del wsdl del servizio senza problemi. I problemi nascono al momento in cui eseguo il metodo "Login" (o qualsiasi altro) e l'exception che viene generata è
{"Previsto elemento iniziale 'faultcode' dallo spazio dei nomi ''. Trovato elemento 'faultactor' dallo spazio dei nomi ''. Riga 2, posizione 281."}
Per debuggare il problema ho utilizzato il WCF Test Client, ottenendo lo stesso risultato, e SoapUI che funziona correttamente.
L'xml generato dal WCF Test Client nell'esecuzione del metodo è
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Header> <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">urn:ACBaseIntf-IACBase#Login</Action> </s:Header> <s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <q1:Login xmlns:q1="urn:ACBaseIntf-IACBase"> <Utente xsi:type="xsd:string">test</Utente> <Password xsi:type="xsd:string">test</Password> </q1:Login> </s:Body> </s:Envelope>mentre quello sparato da SoapUI è
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:ACBaseIntf-IACBase"> <soapenv:Header/> <soapenv:Body> <urn:Login soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <Utente xsi:type="xsd:string" xs:type="type:string" xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">test</Utente> <Password xsi:type="xsd:string" xs:type="type:string" xmlns:xs="http://www.w3.org/2000/XMLSchema-instance">test</Password> </urn:Login> </soapenv:Body> </soapenv:Envelope>Francamente non vedo grosse differenze, voi? Devo anche aggiungere che nel WCF Test Client nella sezione XML -> Response trovo esattamente lo stesso messaggio che ricevo in SoapUI e che contiene il messaggio di "Login failed" (visto che l'utente "test" non esiste).
Se la chiamata "under the hood" funziona, perché mi viene generata l'eccezione?
Ciao e grazie
Enrico
Tutte le risposte
-
lunedì 2 aprile 2012 18:54
ciao
l'elemento soap faultcode serve per tornare un eccezione soap corretta
evidentemente WCF si aspetta tale utilizzo del protocollo, mentre apache non lo usa, e ti torna un messaggio di errore in un altro modo
prova a fare un autenticazione corretta
probabilmente il problema è solo nell'incapsulamento delle eccezioni... cosa peraltro comunque problematica...
aspettiamo tue news
a presto
-
lunedì 2 aprile 2012 19:44
Ciao Enrico,
You wrote on 02/04/2012 :
Se la chiamata "under the hood" funziona, perché mi viene generata l'eccezione?
la domanda è: ma te proprio con Apache dovevi andare a scornarti :-)
La domanda vera è: l'exception ce l'hai in fase di deserializzazione client side, giusto?
Se così fosse un Message Inspector potrebbe essere il tuo miglio amico :-P
<http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extensibility-message-inspectors.aspx>E' curioso avere un faultActor senza un faultCode... :-P
.m
blog @ //milestone.topics.it- Contrassegnato come risposta Enrico Gobbo martedì 3 aprile 2012 09:42
-
martedì 3 aprile 2012 07:10
Ciao Mauro!!
>la domanda è: ma te proprio con Apache dovevi andare a scornarti :-)
Lo sai che se non mi batto contro Golia almeno due volte all'anno non sono felice!! Sarebbe noioso altrimenti il nostro lavoro... Vorrei chiederlo anche io al cliente il perché di una scelta così, però, come mi hai insegnato tu, è lui che comanda, ergo...
> La domanda vera è: l'exception ce l'hai in fase di deserializzazione client side, giusto?
> Se così fosse un Message Inspector potrebbe essere il tuo miglio amico :-PEsatto, ed il bello è che lo stato del channelfactory è sempre a "Opened".. Vado a conoscere il mio nuovo migliore amico, forse è meglio!!
Farò sapere i risultati.
Ciao Enrico
-
martedì 3 aprile 2012 09:19
Ciao Enrico,
l'unica differenza tra i due messaggi di richiesta mi sembra la Action. Ad ogni modo Mauro ti ha dato già un ottimo suggerimento, ma volevo aggiungere che probabilmente in questo caso hai semplicemente un ordine diverso degli elementi (faultActor prima di faultCode) e questo ti costringerà a ricostruire manualmente il messaggio di fault che hai in risposta.
my2cents :)
Fabio Cozzolino
Microsoft MVP Connected System Developer
Blogs: http://dotnetside.org/blogs/fabio http://weblogs.asp.net/fabio
Windows Azure. Programmare per il Cloud Computing - http://bit.ly/l5An4P
Professional WCF 4 - http://bit.ly/avD3xE -
martedì 3 aprile 2012 09:42
Ciao a tutti!! Implementando IClientMessageInspector sono riuscito a catturare il fault generato e quindi ad interpretarlo. Nell'app.config ho configurato una behaviourExtension assegnandola quindi all'endpoint behaviour. A meno che l'app SoapUI non gestisca in modo differente l'ordine degli elementi, in entrambi i banchi di prova il messaggio che ricevevo era identico (mi sarei meravigliato se non fosse stato così!!)
Grazie per le dritte
Enrico

