Domanda

Ho qualche problema con la stringa di connessione di una delle mie applicazioni ASP.NET 2.0.Ci sono casi in cui otterrei un file La proprietà ConnectionString non è stata inizializzata problema che si verifica in modo casuale, intermittente e senza alcuna ragione.

La stringa di connessione proviene effettivamente da un servizio Web, poiché a diversi tipi di utenti vengono forniti diversi set di stringhe di connessione a seconda del livello utente.

Quello che ho fatto finora è questo:

Ho una pagina master (mstr.page) e il codice corrispondente dietro (mstr.page.vb).

Nella mia pagina master, recupero inizialmente la stringa di connessione e la memorizzo in una variabile di sessione, ad es.

Session("ConnString") = "RetrievedConnectionString"

Ora in una delle mie pagine, diciamo page1.aspx.vb, utilizzo le funzioni condivise pubbliche da una classe (denominata MyClass.vb) e usarlo nel mio page1.aspx.vb.

Alcuni codici di riferimento:

[MyClass.vb]
Imports System.Web

NameSpace ClassNameSpace
  Public Class Admin
    Protected Shared da as New DataAccess()

    Public Shared Function MYFunction() as String
      'Execute some sql statements here, using the DataAccess
      stringToReturn = Ctype(da.ExecuteScalar("SQLCommand"), String)
      Return stringToReturn
    End Function
  End Class
End NameSpace

[DataAccessClass.vb]
Public Class DataAccess()
  Private m_ConStr As String = ""

  Public Sub New()
    m_ConStr = HttpContext.Current.Session("ConnString")
  End Sub

  'Some methods for SQL statement execution (ExecuteQuery, ExecuteScalar)
End Class

[Page1.aspx.vb]
Imports ClassNameSpace

Protected Sub Page_Load(....) Handles Me.Load
  Dim strValue as String = Admin.MyFunction()
End Sub

Ho inserito il codice sopra per mostrarti un'idea approssimativa di come stanno andando le cose.

Fondamentalmente, la funzione Admin.MyFunction() a volte fallisce, perché nella classe di accesso ai dati, la stringa di connessione sembra aver perso il suo valore (vuoto o Niente).

Questa cosa mi preoccupa già da un bel po' di tempo.

Spero che qualcuno possa indicarmi la giusta direzione per risolvere questo problema.Fondamentalmente, voglio che la mia stringa di connessione che viene recuperata da ogni utente che visita l'applicazione web venga mantenuta sempre e utilizzata ovunque.La variabile di sessione non sembra essere la soluzione migliore poiché quando ASP.NET ricicla il suo processo, la sessione viene persa.

A proposito, inizialmente recupero la stringa di connessione tramite la pagina master da un servizio web.Ho provato a inserire la stessa funzione di recupero nella classe di accesso ai dati quando la condizione è che la variabile di sessione venga persa, ma penso che la mia applicazione non possa connettersi al servizio Web durante il processo di riciclo.

Qualsiasi consiglio sarebbe molto apprezzato al riguardo.

Aggiornamento su questo:

Ho provato a utilizzare Session Variable e a impostare la modalità su State Server, ma a quanto pare alcune DLL che sto utilizzando non possono essere serializzate, quindi sono tornato al punto di partenza.

Esiste un modo migliore per farlo?

È stato utile?

Soluzione

Una cosa da controllare è se la tua sessione viene bloccata.Se si utilizza la sessione in memoria (predefinita), le sessioni muoiono ogni volta che un processo di lavoro ASP.NET viene riciclato.Se questo causa il tuo problema, potresti dover esaminare l'utilizzo di ASP.NET SessionServer in IIS o SQL Server come archivio di sessione.

Altri suggerimenti

Cercherei di limitare il più possibile l'utilizzo della Sessione per questo tipo di cose.Se utilizzi Web.Config per memorizzare le stringhe di connessione, puoi accedervi in ​​qualsiasi momento e non scadrà come la sessione.

Potresti anche prendere in considerazione l'idea di avere una classe di accesso ai dati statica se è la stessa per tutti gli utenti per l'istanza dell'applicazione...

Questo è esattamente lo stesso problema che stavo riscontrando e si è scoperto che le variabili di sessione morivano, quindi la stringa di connessione non poteva essere inizializzata correttamente.

Perché la tua app non può utilizzare una sola stringa di connessione?e perché la stringa di connessione deve arrivare tramite un servizio web?ciò aggiunge un'enorme quantità di latenza all'intero processo.Presumo che probabilmente abbia a che fare con la sicurezza dei dati nel tuo database.

Se tu Avere per fare questo, direi, non puoi avere una stringa di connessione fallback/predefinita?Avvolgi il tuo codice che tenta di estrarlo dalla sessione con qualche gestione degli errori e se fallisce ripristina il valore predefinito?

Inserirei il servizio Web e l'app Web in pool di app diversi.Quindi aumenta la durata del timeout del pool di app Web.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top