Con risposta WCF: Utilizzare Apache WEB Service..

  • lunedì 2 aprile 2012 15:12
     
      Contiene codice

    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


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     

  • lunedì 2 aprile 2012 19:44
     
     Con risposta

    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 :-P

    Esatto, 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