Proprietà di un web service viene riconosciuta ma non inizializzata a ...

lunedì 19 gennaio 2009 - 15.46

paquito_ita Profilo | Senior Member

Ciao,

ho realizzato un web service usando wsdl.exe sul file wsdl target come mi avevi suggerito. Ora utilizzo un'applicazione esterna da me realizzata per testare i web method e tutto funziona bene.
Il web service ha pero' una property chiamata Credentials dove l'utente deve inserire le proprie credenziali. Nell'applicazione di testing una volta creata l'istanza al web service sono in grado di "vedere" tale proprietà e la inizializzo con dei valori di test.

Tuttavia il problema è che quando lato server vado ad estrarre i valori di tale propritaà all'interno di un web method, la proprietà risulta "null". Ho anche provato a mettere dei breakpoint e ho notato che lato server la proprietà non viene inizializzata.

Dove puo' essere l'errore?La web reference al web service è corretta, altrimenti nemmeno i web method sarebbero invocati correttamente. Ho pensato l'errore potesse essere nelle intestazione dei web method. mentre infatti ogni web method ha parametri come [SoapDocumentMethodAttribute] definiti con wsdl.exe, per la proprietà non ho impostato nulla e forse per questo non viene inizuializzata.

Di seguito il codice circa la proprietà ed un web method:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Grazie

Jeremy Profilo | Guru

Il problema stà nel fatto che ad ogni chiamata ad un qualsiasi WebMethod del WebService, viene creata una nuova istanza del proxy, quindi la variabile che tu tenti di leggere non è mai la stessa....per questo la trovi Null.

Puoi risolvere dichiarando la tua variabile Shared(condivisa).....in questo modo , ti garantisco che, per tutta la sessione, la variabile rimane valorizzata.
In alternativa...puoi memorizzare il valore in file .txt, residente sul server, o in un Db, sempre residente sul server.

Se hai bisogno di altre informazioni......Facci sapere
Ciao.

paquito_ita Profilo | Senior Member

Grazie per il consiglio!

La prima opzione (usando la keyword "shared") risulterebbe prefereibile a mio parere. Ovviamente la proprietà ed il suo valore rimangono confinati solamente all'utente che vi accede e alla sua sessione, senza che in alcun modo interferisca con altri accessi al web service giusto?

Ho provato ad usare l'intellisense di Visual Studio per aggiungere la keywork "shared" ma non compare. Come posso fare a dichiarla shared? Mi potresti fare un esempio sulla falsa riga del mio codice?
Grazie
private NetworkCredential _Credentials; public NetworkCredential Credentials { get { return _Credentials; } set { _Credentials = value; } }

Jeremy Profilo | Guru

>Grazie per il consiglio!
>
>La prima opzione (usando la keyword "shared") risulterebbe prefereibile
>a mio parere. Ovviamente la proprietà ed il suo valore rimangono
>confinati solamente all'utente che vi accede e alla sua sessione,
>senza che in alcun modo interferisca con altri accessi al web
>service giusto?
No...credo di no....rimane valorizzata per qualunque utente acceda(credo...comunque fai delle prove).

Addesso non ho idea di come gestisci il controllo delle credenziali....comunque questo non dovrebbe crearti un problema...nel senso....le credenziali dovrebbero essere poi confrontate con qualcosa di residente sul server.No???

L'equivalente di Shared,in C, dovrebbe essere Static.

Prova un pò

Comunque se spieghi un pò meglio lo scenario...possiamo vedere come risolvere.

Ciao

paquito_ita Profilo | Senior Member

Ciao,

>Comunque se spieghi un pò meglio lo scenario...possiamo vedere come risolvere.

Io ho un web service che permette, da remoto, di aggiungere un file al server. L'utente invoca il web service e aggiunge le proprie credenziali alla proprietà "Crendetials" di tipo NetworkCredentials.

Lato server, quando devo gestire l'inserimento del file, passato come parametro, estraggo le credenziali dalla proprietà (almeno questo è quello che vorrei) e procedo ad autenticare la richiesta tramite un match con il DB.
L'idea che nome utente e password siano static non mi ispira molta fiducia, nel senso che sono informazioni sensibili e "disponibili", seppur lato server. Il mio desiderio era che tali credenziali fossero in qualche modo "relegate" alla singola richiesta dell'utente e poi distrutte al termine del servizio.

Devo forse operare qualcosa a livello di protocollo SOAP?

Grazie di nuovo

Jeremy Profilo | Guru

Se passi le credenziali come parametro del tuo WebMethod, non hai poi bisogno che rimangano condivise per tutta la sessione.

In alternative puoi inviare le credenziali,fare il match con quelle residenti nel Db, e, in caso di match positivo settare una variabile condivisa che permette le operazioni di inserimento del file.

Praticamente....intendo dire....potresti usare una variabile di appoggio(condivisa) che non contiene informazioni sensibili.

Fammi sapere....
Ciao.

paquito_ita Profilo | Senior Member

Ciao,

>Se passi le credenziali come parametro del tuo WebMethod, non hai poi bisogno che rimangano condivise per tutta la sessione.

Purtroppo non lo posso fare. Devo attenermi alle signatures concordate con altre aziende partner che utilizzano lo stesso web service. Anche loro utilzzano la property "Credentials" dal loro lato.
Cercando su internet circa l'autenticazione nei web service, viene suggerito il seguente metodo (tuttavia l'ho trovato su un sito tedesco e nn sono particolarmente ferrato in materia):
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Tuttavia mi pare abbastanza "verbosa". Sarei pi+ contento di una soluzione più diretta, ammesso sia possibile.
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