15 messaggi dal 23 maggio 2014
Salve a tutti,
il problema che ho ritrovato durante una creazione di esempio di un web service è quando devo richiamare i metodi "forse anche la mancanza della classe, ma lascio a voi la delucidazione da sottopormi:

<WebMethod()> _
Public Function AccessoUtente(ByVal CodContendente As String, Password As String) As Boolean
If SqlMainConn.State = ConnectionState.Closed Then
SqlMainConn.Open()
End If
SqlCmdUtentePermesso.Parameters("@CodContendente").Value = CodContendente
SqlCmdUtentePermesso.Parameters("@Password").Value = Password
SqlCmdUtentePermesso.ExecuteNonQuery()

Return (Int(SqlCmdUtentePermesso.Parameters("@RETURN_VALUE").Value) = 1)
End Function

Dopo aver impostato tutti i richiami che ovviamente non mi danno errori vorrei solo capire cosa ho mancato in questo codice o cosa devo aggiungere, ovviamente dal debug chiamo direttamente il webservice siccome voglio vedere solo se mi restituisce il valore esatto.

l'errore al video che mi viene dato è il seguente:
Eccezione di tipo 'System.NullReferenceException' in WebApplication3.dll non gestita nel codice utente.

un grazie in anticipo per l'aiuto
Ciro
Modificato da Cicico il 30 maggio 2014 11.30 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Ciro, benvenuto nel forum.
Cerca di identificare in quale punto esatto della tua applicazione si sta verificando l'eccezione. "NullReferenceException" significa che stai cercando di usare una variabile che non punta (più) ad alcun oggetto, e perciò vale Nothing.

Dato che non sappiamo qual è l'esatta riga di codice che sta causando il problema, non posso sapere con esattezza se il problema dipende dal webmethod AccessoUtente. Posso provare a commentarlo:
  • Non dovresti riutilizzare la stessa connessione (SqlMainConn) di chiamata in chiamata. Potrebbe essere proprio questa la causa della NullReferenceException. La connessione va sempre istanziata e aperta nel momento in cui ne hai bisogno, e chiusa non appena hai finito di usarla (tutto deve avvenire nell'ambito del metodo AccessoUtente). Esiste già un meccanismo automatico di ottimizzazione chiamato "Connection pooling" che si preoccupa di gestire le connessioni al posto tuo, in modo che creare una nuova istanza sia sempre un'operazione abbastanza rapida.
  • Di solito non è necessario un metodo per autenticare gli utenti perché i WebServices dispongono già di vari meccanismi di autenticazione. Ecco un esempio che sfrutta delle intestazioni del messaggio SOAP per realizzare un'autenticazione personalizzata.
    http://msdn.microsoft.com/it-it/library/vstudio/9z52by6a(v=vs.100).aspx


ciao,
Moreno

Enjoy learning and just keep making
15 messaggi dal 23 maggio 2014
Ciao Moreno grazie per la risposta, si il riferimento del null punta proprio all'if :
If SqlMainConn.State = ConnectionState.Closed Then
SqlMainConn.Open()
End If

mi pare strano che non accetti la chiamata siccome il webservice che sto usando per ora contiene solamente questa funzione, creata da zero per provarla.

Potrebbe essere il firewall che blocca la porta di visualstudio e quindi non stabilisce la connessione?

per le altre dritte per le autenticazioni darò uno sguardo in modo da cambiare anche la modalità di accesso.
Però sono curioso di capire come mai non mi apre la connessione essendo il primo utilizzo anche durante il debug.

Ciao
Ciro
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Ciro,
affinché tu possa usare i membri State e Open dell'oggetto SqlConnection, bisogna che prima ne crei un'istanza con la parola chiave New.

L'eccezione NullReference exception si riferisce appunto al fatto che stai usando quei membri senza aver prima creato un'istanza. Quindi correggi così:

<WebMethod()> _
Public Function AccessoUtente(ByVal CodContendente As String, Password As String) As Boolean
'Qui creo la nuova istanza con la parola chiave New
Using SqlMainConn As New SqlConnection(tuaConnectionString)
SqlMainConn.Open()
SqlCmdUtentePermesso.Parameters("@CodContendente").Value = CodContendente
SqlCmdUtentePermesso.Parameters("@Password").Value = Password
SqlCmdUtentePermesso.ExecuteNonQuery()
Return (Int(SqlCmdUtentePermesso.Parameters("@RETURN_VALUE").Value) = 1)
End Using
End Function

Enjoy learning and just keep making
15 messaggi dal 23 maggio 2014
Ciao Moreno,
Grazie alla tua risposta ho intuito la mia dimenticanza nel richiamare il sub privato dove vengono inizializzati tutti i componenti di connesione e data adapter, fino a quì già siamo a buon punto abbiamo buttato via un po' di ingenuità nel guardare il codice, però ora il problema è vicono alla riga :
SqlCmdUtentePermesso.ExecuteNonQuery()
richiamandomi questa eccezione:
-----------------------------------
Eccezione di tipo 'System.Data.SqlClient.SqlException' in System.Data.dll non gestita nel codice utente

Ulteriori informazioni: Impossibile trovare la stored procedure 'SELECT Contendenti.*
---------------------------------------

Solitamente questo problema è dovuto al fatto che il database non è raggiungibile se non ricordo male. inoltre sto usando l'autenticazione tramite windows, per fare queste prove con il webservice mi conviene utilizzare una autenticazione tremite username e psw?

Siccome sto in locale per varie prove e aggiornamenti e sto usando l'iis express, ora potrebbe essere un problema di firewall ?



Inoltre una richiesta extra al topic, per usare i validatori di asp.net per i vari campi della form, devo richiamare il file Jquery nel file global e web config, potresti farmi capire meglio dove inserirli che ho trovato il codice in giro, ma non ho capito bene il punto dove inserirlo oppure secondo la tua esperienza, mi conviene generare personalmente codice per ogni form che vado a creare senza usare i validatori che fornisce .net ?!?!

Grazie ancora,
Ciro
Modificato da Cicico il 07 giugno 2014 12.28 -
Modificato da Cicico il 07 giugno 2014 12.30 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Ciro,

Cicico ha scritto:

Solitamente questo problema è dovuto al fatto che il database non è raggiungibile

Non andare a memoria ma ragiona sempre sul testo dell'errore che ti viene mostrato.

Impossibile trovare la stored procedure 'SELECT Contendenti.*

Stai cercando di inviare una query, ma il SqlCommand pensa che quella che gli hai inviato sia il nome di una stored procedure, anziché una query SQL. Come mai?
Se stai effettivamente cercando di eseguire una query, allora hai incorrettamente impostato la proprietà CommandType del SqlCommand su "StoredProcedure". Correggi questa impostazione e questo problema dovrebbe risolversi.

Se invece devi effettivamente eseguire una stored procedure, allora c'è qualche altro codice nella tua applicazione che ha sovrascritto il CommandText che avevi originariamente assegnato al SqlCommand.
Se è questo il caso, ecco dimostrata l'importanza di creare e distruggere gli oggetti "connessi" come SqlConnection e SqlCommand nel tempo strettamente necessario.

Tornando al codice che ti ho postato ieri: quello mostra come istanziare una nuova SqlConnection per poi distruggerla non appena possibile. Quello che ho dimenticato di dire è che la stessa cosa dovresti farla anche con ogni SqlCommand legato a quella connesione.

Riposto il codice di ieri, questa volta completo (giusto per dimostrare il concetto - perdona eventuali errori di sintassi).
<WebMethod()> _
Public Function AccessoUtente(ByVal CodContendente As String, Password As String) As Boolean
  'Qui creo la nuova istanza con la parola chiave New
  Using SqlMainConn As New SqlConnection(tuaConnectionString)
    SqlMainConn.Open()
    'Qui creo il SqlCommand
    Using SqlCmdUtentePermesso As SqlCommand = SqlMainConn.CreateCommand()
      'Imposto il command text con il nome della stored procedure
      SqlCmdUtentePermesso.CommandText = "verifica_utente"
      'Indico che si tratta proprio di una stored procedure
      SqlCmdUtentePermesso.CommandType = CommandType.StoredProcedure;
      SqlCmdUtentePermesso.Parameters("@CodContendente").Value = CodContendente
      SqlCmdUtentePermesso.Parameters("@Password").Value = Password
      SqlCmdUtentePermesso.ExecuteNonQuery()
      Return (Int(SqlCmdUtentePermesso.Parameters("@RETURN_VALUE").Value) = 1)
'Questi blocchi using chiuderanno e dereferenzieranno gli oggetti
    End Using
  End Using
End Function


Cicico ha scritto:

sto usando l'autenticazione tramite windows

Mi sembra di aver capito che i tuoi utenti sono memorizzati in un database SQL Server, quindi la Windows Authentication non è applicabile in questo caso. Puoi chiarire? Stai sviluppando un sito internet o intranet?

Cicico ha scritto:

mi conviene generare personalmente codice per ogni form che vado a creare senza usare i validatori che fornisce .net ?!?!

Sì, usa pure i validatori di ASP.NET. Con ASP.NET 4.5 hai due modalità di validazione client. C'è un post di qualche giorno fa in cui se ne è parlato.
http://forum.aspitalia.com/forum/post/403620/Piccolo-Chiarimento-Errore-UnobtrusiveValidationMode.aspx
Se scegli di usare la modalità unobtrusive, trovi un aiuto qui:
http://www.codeproject.com/Articles/287278/Unobtrusive-Validation-with-ASP-NET
http://www.codeguru.com/csharp/.net/net_asp/using-unobstructive-validation-in-asp.net-4.5-web-forms.htm

ciao,
Moreno
Modificato da BrightSoul il 07 giugno 2014 13.40 -

Enjoy learning and just keep making
15 messaggi dal 23 maggio 2014
Ciao Moreno,

Allora io il codice l'ho lasciato così:

------------------
Public Function AccessoUtente(ByVal CodContendente As String, ByVal Password As String) As Boolean
Call InitializeComponent()
'Qui creo la nuova istanza con la parola chiave New
'Using SqlMainConn As New SqlClient.SqlConnection("Data Source=CICICO;Initial Catalog=AsteonDB;Integrated Security=True")
'SqlMainConn.Open()
'SqlCmdUtentePermesso.Parameters("@CodContendente").Value = CodContendente
'SqlCmdUtentePermesso.Parameters("@Password").Value = Password
'SqlCmdUtentePermesso.ExecuteNonQuery()
'Return (Int(SqlCmdUtentePermesso.Parameters("@RETURN_VALUE").Value) = 1)
'End Using
If SqlMainConn.State = ConnectionState.Closed Then
SqlMainConn.Open()
End If
SqlCmdUtentePermesso.Parameters("@CodContendente").Value = CodContendente
SqlCmdUtentePermesso.Parameters("@Password").Value = Password
SqlCmdUtentePermesso.ExecuteNonQuery()

Return (Int(SqlCmdUtentePermesso.Parameters("@ReturnValue").Value) = 1)
End Function
------------------------------------

siccome ho creato come dicevi tu ho creato delle stored procedure, ad ogni modo l'errore mio è stato non riavviare il debug della pagina il vero errore mi viene visualizzato dopo, ad ogni modo mi hai incuriosito sul fatto di usare i comandi tramite using/end using, in modo da disconnettere il comando dato, ma in alternativa con la casella degli strumenti, in questo caso particolare con il data adapter/command le funzioni richiamate non vengono chiuse in automatico dal garbage?


Problema risolto, non chiamavo la giusto stored procedure, quando si va di fretta e non si guarda il codice :) ..

Aspetto tue notizie per la curiosità di sopra.

Grazie mille
Modificato da Cicico il 07 giugno 2014 15.07 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Ciro,

Cicico ha scritto:
Problema risolto

Ok, benissimo :)

Cicico ha scritto:

in alternativa con la casella degli strumenti

Quali controlli stai trascinando dalla casella degli strumenti, esattamente? Te lo chiedo perché le classi SqlConnection e SqlCommand non sono controlli ASP.NET, quindi non li troverai nella casella degli strumenti.

Cicico ha scritto:

le funzioni richiamate non vengono chiuse in automatico dal garbage?

Alla fine sì, se anche dimenticassi di chiudere le connessioni, il garbage collector lo farebbe al tuo posto.
Tuttavia, non puoi affidarti al garbage collector perché rischieresti che varie decine di connessioni restino aperte inutilmente, magari fino al raggiungimento del limite software imposto dal database.
Sarebbe come lasciare aperto il rubinetto dell'acqua perché tanto, prima o poi, qualcuno che viene a chiuderlo arriva.

Chiudi sempre le connessioni appena hai finito di usarle. Se stai usando un controllo dalla casella degli strumenti come il SqlDataSource, allora sarà esso stesso a gestire coscientemente l'apertura e la chiusura della connessione. Quel che devi fare tu è semplicemente configurarlo dalla finestra delle proprietà (o agendo direttamente sul markup).

ciao,
Moreno
Modificato da BrightSoul il 08 giugno 2014 22.41 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.