Server did not recognize the value of HTTP Header SOAPAction

mercoledì 14 gennaio 2009 - 15.35

paquito_ita Profilo | Senior Member

Ciao,

ho cambiato approccio e ora uso direttamente la Web Reference (tramite "Add Web reference" di VS) al loro file wsdl mentre programmo la Business Logic del mio web service. In tal modo sono sicuro di usare le stesse classi/proprietà.

Tuttavia quando invoco (sulla piattaforma di uno dei partner) il mio web service ottengo il seguente errore:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Dove potrebbe risiedere l'errore?
Sembra che in qualche modo non riesca ad accedere al WEB method invocato (nel caso specifico "GetFolderContent()").

Eppure i passi sono semplici:

[1] Creata web reference al web service partner (per es. PA1)
[2] Aggiunto tale riferimento nel codice: using PartnersWS.PA1;
[3] Implementato il metodo GetFolderContent() (sfruttando l'intellisense le varie classi descritte dal file wsdl sono presentate correttamente)

Grazie mille

PS. Ho scritto un nuvo post perché pensavo che aggiungendolo ad una risposta già accettata rimanesse poco visibile.

rossimarko Profilo | Guru

Ciao,

dall'errore sembra proprio che il metodo richiamato su server non esista o non abbia la stessa firma.

Hai provato ad invocarlo in un altro modo oppure con il webservice studio (http://www.codeplex.com/WebserviceStudio)?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paquito_ita Profilo | Senior Member

Il metodo risiede sul nostro server e lo invoco da una piattaforma di un partner. Ho verificato il nome del metodo e la signature e sono corrette.
Tempo fa funzionava correttamente, poi hanno cambiato il file wsdl e ora non funziona piu'.

Ho usato il .NET web service studio per generare la classe proxy a partire dal file wsdl del partner, e l'ho aggiunta al mio codice per il Web Service. Ho rimosso le web reference al web sevice del partner in modo che il mio codice ora usa il file proxy generato.

Tuttavia continuo ad avere lo stesso problema:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Invocando il mio Web Method da una mia applicazione di testing che semplicemente usa una web reference e invoca il web method, tutto funziona bene.

Tralasciando per il momento il fatto di avere lo stesso wsdl, come potrei risolvere tale problema?
Grazie

rossimarko Profilo | Guru

Richiamandolo direttamente dal webservicestudio con la schermata di test va in errore? Il metodo all'interno del webservice studio viene visualizzato con la firma e i parametri corretti?

C'è qualche applicazione che riesce a richiamare il webservice correttamente?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paquito_ita Profilo | Senior Member

>Richiamandolo direttamente dal webservicestudio con la schermata
>di test va in errore? Il metodo all'interno del webservice studio
>viene visualizzato con la firma e i parametri corretti?

Ho controllato la signature ed è corretta, ho invocato con il tool e il risultato è giusto!!

>C'è qualche applicazione che riesce a richiamare il webservice correttamente?
Ho scritto una semplice applicazione in C# che usando una web reference al mio web service ne invoca il metodo in questione. E il risultato è corretto.

rossimarko Profilo | Guru

Quindi invocandolo dal webservice studio e da una applicazione di test a cui hai aggiunto le webreference funziona..

A questo punto mi viene da dire che le webreference della tua applicazioni non sono corrette... Hai già provato a cancellarle e ricrearle?
C'è qualche tipo di autenticazione particolare sul webservice? Magari windows authentication?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paquito_ita Profilo | Senior Member

>Quindi invocandolo dal webservice studio e da una applicazione
>di test a cui hai aggiunto le webreference funziona..
Si

>A questo punto mi viene da dire che le webreference della tua applicazioni non sono corrette... Hai già provato a cancellarle e ricrearle?
Ti riferisci alle web reference che ho usato per i miei test? Ad ogni modo ho usato l'endpoint del mio web service con web service studio e funziona. Nella applicazione del partner devo indicare l'endpoint e ho usato lo stesso per web service studio

>C'è qualche tipo di autenticazione particolare sul webservice? Magari windows authentication?
Per accedere al mio web service non è necessaria alcuna autenticazione.

Inizio a disperare...

rossimarko Profilo | Guru

Dovresti verificare che tipo di chiamata soap viene fatta nei due casi e verificare se sono uguali.

Per farlo devi usare qualche tool che esegue il monitoring delle chiamate via rete. Io conosco Charles (http://www.charlesproxy.com/) ma è a pagamento. Se no c'è anche NetworkMonitor (http://www.microsoft.com/downloads/details.aspx?familyid=f4db40af-1e08-4a21-a26b-ec2f4dc4190d&displaylang=en) ma non so se riesci a vedere il dettaglio della chiamata soap..
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paquito_ita Profilo | Senior Member

> Se no c'è anche NetworkMonitor (http://www.microsoft.com/downloads/details.aspx?familyid=f4db40af-1e08-4a21-a26b-ec2f4dc4190d&displaylang=en)
L'ho scaricato, ma non è proprio intuibile e purtroppo sono con l'acqua alla gola e non posso prendermi tempo per imparare ad usarlo.

Invocando il mio web method da un altro partner ottengo lo stesso errore (I due usano lo stesso wsdl), mentre fra i due partner le cose funzionano bene.

Ho notato che pur avendo generato la classe proxy a partire dal wsdl comune ed usandola per referenziare le mie classi nel WS il wsdl generato con indirizzoMioWS.asmx?wsdl risulta differente dal loro.
Loro in particolare usano un file wsdl e uno xsd.

Non so se questo possa aiutare a capire meglio le cose.Tempo fa avevo sperimentato un problema analogo che tuttavia avevo risolto creando la classe proxy (all'epoca veniva generata un'interfaccia mentre ora una partial class) e aggiungendola al codice

rossimarko Profilo | Guru

>Ho notato che pur avendo generato la classe proxy a partire dal
>wsdl comune ed usandola per referenziare le mie classi nel WS
>il wsdl generato con indirizzoMioWS.asmx?wsdl risulta differente
>dal loro.
>Loro in particolare usano un file wsdl e uno xsd.
>
>Non so se questo possa aiutare a capire meglio le cose.Tempo
>fa avevo sperimentato un problema analogo che tuttavia avevo
>risolto creando la classe proxy (all'epoca veniva generata un'interfaccia
>mentre ora una partial class) e aggiungendola al codice
>

Scusa ma faccio un po' fatica a capire il contesto. Se il wdsl generato è diverso vuol dire che i due webservice sono diversi, quindi è per quello che non riesce a richiamare il metodo.
Il tuo webservice deve adottare delle specifiche ben precise giusto?

Cerco di riepilogare quanto ho capito. Tu devi creare un webservice che rispecchia le specifiche di un wsdl. L'hai creato ma le chiamate al tuo webservice non funzionano perchè ti da l'errore segnalato.

Per creare il tuo webservice come hai fatto? Tramite il wsdl (http://www.codeproject.com/KB/XML/ReverseEng.aspx) si può creare una classe proxy che mappa le chiamate al web.service. Volendo da questa classe si possono determinare i metodi del webservice e quindi si può fare una implementazione dello stesso in un altro sito (http://www.codeproject.com/KB/XML/ReverseEng.aspx).

Se i metodi sono esattamente uguali (controlla anche il casesensitive) e le impostazioni sono corrette (no autenticazione e chiamate soap abilitate) una volta impostato l'url corretto dovrebbe andare correttamente.. Hai verificato i namespace?

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paquito_ita Profilo | Senior Member

>Il tuo webservice deve adottare delle specifiche ben precise giusto?
Dovrebbe implementare gli stessi web method. I mio file wsdl risulta diverso perché io non ho un file xsd, mentre loro lo importano nel loro file wsdl.

>Cerco di riepilogare quanto ho capito. Tu devi creare un webservice che rispecchia le specifiche di un wsdl. L'hai creato ma le chiamate al tuo webservice non funzionano perchè ti da l'errore segnalato.
Esattamente o quasi, nel senso che se le invoco dalla piattaforma partner NON funzionano. Mentre se le invoco da webservice studio, per esempio, tutto ok.

>Per creare il tuo webservice come hai fatto?
Ho scritto i web method a mano usando l'intellisense di VS dopo aver referenziato il loro file wsdl comune.

>Tramite il wsdl (http://www.codeproject.com/KB/XML/ReverseEng.aspx) si può creare
>una classe proxy che mappa le chiamate al web.service. Volendo da questa classe si possono determinare i metodi del webservice
>e quindi si può fare una implementazione dello stesso in un altro sito (http://www.codeproject.com/KB/XML/ReverseEng.aspx).
>Se i metodi sono esattamente uguali (controlla anche il casesensitive)
>e le impostazioni sono corrette (no autenticazione e chiamate
>soap abilitate) una volta impostato l'url corretto dovrebbe andare
>correttamente..
Nel mio ptah: C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\Bin di VS non ho il file wsdl.exe. Ho provato a rieseguire l'installazione aggiungendo (oltre a C# anche cùù come linguaggio) ma ninete da fare.
PS.Il secondo link è uguale al primo

>Hai verificato i namespace?
Il namespace nel mio codice del WS è:
[WebService(Namespace = "http://www..../soap/WorkspaceSynchronization")]
e nella classe proxy generata:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Lo stesso usato dai partner (con l'eccezione che loro usano anche il file xsd):
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

rossimarko Profilo | Guru

Allora prova a generare la classe proxy partendo dal loro WSDL che incorpora lo schema.
Poi implementa i metodi come riportato nell'articolo di esempio: http://www.codeproject.com/KB/XML/ReverseEng.aspx

PS: prima mi sono sbagliato a darti il link del wsdl: http://msdn.microsoft.com/en-us/library/7h3ystb6.aspx
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

paquito_ita Profilo | Senior Member

Quindi partendo da una cosa del genere (per il web method AddItem):
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Lo modifico in:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Miticooo!!!! Funziona!!!

Quindi dove era l'intoppo secondo te? Ad ogni modo ho creato un nuovo web service e ho usato come web method quelli generati per la classe proxy.
Un domani qualora ricambiassero il wsdl devo rigenerare la classe e fare copia/incolla in un web service? O c'è un modo meno artigianale?

Grazie mille Marco per la pazienza!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5