2012-03-26 16 views
5

Questo post cercava originariamente di trovare il problema, che pensavo fosse un problema web.config. Ho anche pensato che fosse qualcosa nel codice dietro della mia pagina principale. Tutto il testo qui sopra fa parte del processo di ricerca del problema, scorri verso il basso per gli aggiornamenti più recenti.Utilizzo di 2 database per informazioni sulla sessione in ASP.NET

Il mio sito Web consente agli utenti di digitare un codice in una casella di testo. Se viene immesso un codice riconosciuto, la pagina si aggiornerà e visualizzerà un messaggio di benvenuto per quell'utente, altrimenti verrà visualizzato un messaggio di errore. Sto inserendo il codice inserito manualmente in una sessione in modo che il loro nome possa essere richiamato. Non riesco a far passare la sessione tra le pagine. Tutto il mio codice è nella pagina vb della pagina principale e non so cosa sto facendo male.

  • Mi è stato detto di verificare EnableSessionState="true" ma che non funziona sulle pagine master.
  • Mi è stato detto di verificare le impostazioni IIS, ma non posso perché non ho le autorizzazioni.
  • Provato SessionState cookieless="UseUri" e in qualche modo che ha creato un ciclo di reindirizzamento senza fine.
  • Ho eseguito il debug delle funzioni e restituiscono valori.
  • La casella di testo si spegne quando inserisco un codice e il messaggio di benvenuto viene visualizzato con il nome e il cognome dell'utente, quindi so che funziona.
  • Ho verificato che non ci sia codice Session.Abandon in nessun punto del sito.
  • Ho aggiunto un Watch a ogni istanza di Session("IB") nella pagina e sono stati compilati correttamente quando inserisco un codice nella casella di testo. Quindi quando faccio clic su un collegamento per passare a un'altra pagina, il debugger si arresta sulla prima riga nel mio Page_Load, Dim ib As String = CType(Session.Item("IB"), String) e tutte le variabili IB guardate diventano immediatamente Nothing.

ecco il codice dietro la pagina master:

Imports System.Data 
Imports System.Data.SqlClient 
Imports System.Data.OleDb 
Partial Class MasterPage 
    Inherits System.Web.UI.MasterPage 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
     Dim BAccount As String = CType(Session("BAccount"), String) 
     If Not IsPostBack Then 
     If Session("BAccount") Is Nothing Then 
      'no such value in session state, show textbox for IB to enter code 
      IBText.Visible = True 
      IBTextBox.Visible = True 
      IBTextBoxButton.Visible = True 
      lbNotIB.Visible = False 
     Else 
      'call function 
      GetSessionValues(BAccount) 
     End If 
    End If 
End Sub 
Protected Function GetSessionValues(ByVal Code As String) As Boolean 
    Dim FirstName As String = CType(Session("First_Name"), String) 
    Dim LastName As String = CType(Session("Last_Name"), String) 
    Dim Name As String = CType(Session("Name"), String) 
    If GetAccountName(FirstName, LastName) Then 
     'hide textbox 
     IBText.Visible = False 
     IBTextBox.Visible = False 
     IBTextBoxButton.Visible = False 
     'show welcome message to user if IB code exists in database 
     lblIB.Visible = True 
     lblIB.Text = "Welcome, " + Session("First_Name") + " " + Session("Last_Name") + "." 
     lbNotIB.Visible = True 
     lbNotIB.Text = "Not " + Session("First_Name") + " " + Session("Last_Name") + "?" 
     Return True 
    ElseIf GetBackUpAccountName(Name) Then 
     'hide textbox 
     IBText.Visible = False 
     IBTextBox.Visible = False 
     IBTextBoxButton.Visible = False 
     'show welcome message to user if IB code exists in database 
     lblIB.Visible = True 
     lblIB.Text = "Welcome, " + Session("Name") + "." 
     lbNotIB.Visible = True 
     lbNotIB.Text = "Not " + Session("Name") + "?" 
     Return True 
    Else 
     'IB code not found 
     'shows error message in red 
     lblIB.ForeColor = Drawing.Color.Red 
     lblIB.Text = "Account not found, please try again." 
     Return False 
    End If 
End Function 
Private Function GetAccountName(ByRef FirstName As String, ByRef LastName As String) As Boolean 
    'declare variable 
    Dim BAccount As String = CType(Session("BAccount"), String) 
    'sql statement for baccount information 
    Dim sql As String = "SELECT BAccount, First_Name, Last_Name FROM IB INNER JOIN IB_BUISNESS_INFORMATION ON (IB.IB_ID = IB_BUISNESS_INFORMATION.IB_ID) WHERE BAccount = @BAccount" 
    Using conn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("IBConnectionString").ConnectionString) 
     Using cmd As New SqlCommand(sql, conn) 
      cmd.Parameters.AddWithValue("@BAccount", SqlDbType.VarChar) 
      cmd.Parameters("@BAccount").Value = IBTextBox.Text 
      If IBTextBox.Text Is Nothing Then 
       cmd.Parameters("@BAccount").Value = DBNull.Value 
      Else 
       cmd.Parameters("@BAccount").Value = IBTextBox.Text 
      End If 
      conn.Open() 
      Using rdr As SqlDataReader = cmd.ExecuteReader 
       If (rdr.Read) Then 
        FirstName = rdr("First_Name").ToString() 
        LastName = rdr("Last_Name").ToString() 
        Return True 
       Else 
        Return False 
       End If 
      End Using 
      conn.Close() 
     End Using 
    End Using 
End Function 
Private Function GetBackUpAccountName(ByRef Name As String) As Boolean 
    'declare variable 
    Dim BAccount As String = CType(Session("BAccount"), String) 
    'sql statement for baccount information in case BAccount is not found, search here next 
    Dim backupsql As String = "SELECT BAccount, Name FROM brokermaster WHERE BAccount = ?" 
    Using conn As New OleDbConnection(System.Configuration.ConfigurationManager.ConnectionStrings("BackUpConnectionString").ConnectionString) 
     Using cmd As New OleDbCommand(backupsql, conn) 
      cmd.Parameters.AddWithValue("?", SqlDbType.VarChar) 
      cmd.Parameters("?").Value = IBTextBox.Text 
      If IBTextBox.Text Is Nothing Then 
       cmd.Parameters("?").Value = DBNull.Value 
      Else 
       cmd.Parameters("?").Value = IBTextBox.Text 
      End If 
      conn.Open() 
      Using backuprdr As OleDbDataReader = cmd.ExecuteReader 
       If (backuprdr.Read) Then 
        Name = backuprdr("Name").ToString() 
        Return True 
       Else 
        Return False 
       End If 
      End Using 
      conn.Close() 
     End Using 
    End Using 
End Function 
Protected Sub CustomValidator1_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate 
    'declare variables 
    Dim FirstName As String = CType(Session("First_Name"), String) 
    Dim LastName As String = CType(Session("Last_Name"), String) 
    Dim Name As String = CType(Session("Name"), String) 
    If (Not GetSessionValues(args.Value)) Then 
     args.IsValid = False 
    Else 
     args.IsValid = True 
    End If 
    If GetAccountName(FirstName, LastName) Then 
     'set session variables 
     Session("First_Name") = FirstName 
     Session("Last_Name") = LastName 
     'hide textbox 
     IBText.Visible = False 
     IBTextBox.Visible = False 
     IBTextBoxButton.Visible = False 
     args.IsValid = True 
     'show welcome message to user if IB code exists in database 
     lblIB.Visible = True 
     lblIB.Text = "Welcome, " + Session("First_Name") + " " + Session("Last_Name") + "." 
    ElseIf GetBackUpAccountName(Name) Then 
     'set session variables 
     Session("Name") = Name 
     'hide textbox 
     IBText.Visible = False 
     IBTextBox.Visible = False 
     IBTextBoxButton.Visible = False 
     args.IsValid = True 
     'show welcome message to user if IB code exists in database 
     lblIB.Visible = True 
     lblIB.Text = "Welcome, " + Session("Name") + "." 
    Else 
     'IB code not found 
     args.IsValid = False 
     'shows error message in red 
     lblIB.ForeColor = Drawing.Color.Red 
     lblIB.Text = "Account not found, please try again." 
    End If 
End Sub 
Protected Sub IBTextBoxButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles IBTextBoxButton.Click 
    If Page.IsValid Then 
     'declare variables 
     Dim LSD As String = CType(Session("LSD"), String) 
     Dim LSC As String = CType(Session("LSC"), String) 
     Dim BAccount As String = CType(Session("BAccount"), String) 
     Session("BAccount") = IBTextBox.Text 
     'add session variable 
     If GetCompanyName(LSD) Then 
      Session("LSD") = LSD 
     End If 
     'add session variable 
     If GetWebsite(LSC) Then 
      Session("LSC") = LSC 
     End If 
    End If 
End Sub 
Private Function GetCompanyName(ByRef LSD As String) As Boolean 
    'declare variable 
    Dim BAccount As String = CType(Session("BAccount"), String) 
    'sql statement to get company information 
    Dim sql As String = "SELECT Company_Name, BAccount FROM IB_CONTACT_INFORMATION INNER JOIN IB_BUISNESS_INFORMATION ON (IB_CONTACT_INFORMATION.IB_ID = IB_BUISNESS_INFORMATION.IB_ID) WHERE BAccount = @BAccount" 
    Using conn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("IBConnectionString").ConnectionString) 
     Using cmd As New SqlCommand(sql, conn) 
      cmd.Parameters.AddWithValue("@BAccount", SqlDbType.VarChar) 
      cmd.Parameters("@BAccount").Value = IBTextBox.Text 
      If IBTextBox.Text Is Nothing Then 
       cmd.Parameters("@BAccount").Value = DBNull.Value 
      Else 
       cmd.Parameters("@BAccount").Value = IBTextBox.Text 
      End If 
      conn.Open() 
      Using rdr As SqlDataReader = cmd.ExecuteReader 
       If (rdr.Read) Then 
        LSD = rdr("Company_Name").ToString() 
        Return True 
       Else 
        Return False 
       End If 
      End Using 
      conn.Close() 
     End Using 
    End Using 
End Function 
Private Function GetWebsite(ByRef LSC As String) As Boolean 
    'declare variable 
    Dim BAccount As String = CType(Session("BAccount"), String) 
    'sql statement for website information 
    Dim sql As String = "SELECT TOP 1 WebSites, BAccount FROM IB_WEBSITES INNER JOIN IB_BUISNESS_INFORMATION ON (IB_WEBSITES.IB_ID = IB_BUISNESS_INFORMATION.IB_ID) WHERE BAccount = @BAccount" 
    Using conn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("IBConnectionString").ConnectionString) 
     Using cmd As New SqlCommand(sql, conn) 
      cmd.Parameters.AddWithValue("@BAccount", SqlDbType.VarChar) 
      cmd.Parameters("@BAccount").Value = IBTextBox.Text 
      If IBTextBox.Text Is Nothing Then 
       cmd.Parameters("@BAccount").Value = DBNull.Value 
      Else 
       cmd.Parameters("@BAccount").Value = IBTextBox.Text 
      End If 
      conn.Open() 
      Using rdr As SqlDataReader = cmd.ExecuteReader 
       If (rdr.Read) Then 
        LSC = rdr("WebSites").ToString() 
        Return True 
       Else 
        Return False 
       End If 
      End Using 
      conn.Close() 
     End Using 
    End Using 
End Function 
Protected Sub lbNotIB_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbNotIB.Click 
    'if user is not IB that currently holds session, this will destroy the session and allow them to enter different code 
    Session.Abandon() 
    Response.Redirect(Request.RawUrl) 
End Sub 

End Class

aspx:

<asp:Label ID="IBText" runat="server" Text="Enter your IB code here:"></asp:Label> 
    <asp:TextBox ID="IBTextBox" runat="server"></asp:TextBox> 
    <asp:Button ID="IBTextBoxButton" runat="server" Text="Submit" /> 
    <asp:CustomValidator ID="CustomValidator1" runat="server" 
    ControlToValidate="IBTextBox" ForeColor="Red" 
    OnServerValidate="CustomValidator1_ServerValidate"></asp:CustomValidator> 
<asp:Label ID="lblIB" runat="server" Text=""></asp:Label> 

web.config:

<sessionState mode="InProc" cookieless="false" timeout="20" sqlConnectionString="Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***"> 
</sessionState> 

UPDATE: Hah! Finalmente l'ho capito! Quindi ci sono 2 problemi qui. Non avevo <httpModules> impostato nel mio web.config. avevo bisogno di aggiungere:

<httpModules> 
    <add name="Session" type="System.Web.SessionState.SessionStateModule"/> 
</httpModules> 

Reference

Ora il problema è che non ho le informazioni di essere tirato da 2 basi di dati per queste Sessions ma hanno solo 1 banca dati elencati nella sezione <sessionState> del mio file web.config. Ho provato ad aggiungere un secondo <sessionState> ma ha generato un errore.

C'è un modo per includere il secondo database? Se non lo faccio, metà delle mie sessioni rimarrà sul sito web e metà scomparirà. A proposito, non avevo nulla a che fare con la creazione del database, tutto è stato fatto molto prima del mio tempo.

ho provato questo nel web.config, ma anche non funziona:

<sessionState mode="InProc" 
       cookieless="false" 
       timeout="20" 
       sqlConnectionString="IBConnectionString, BackUpConnectionString"> 
</sessionState> 

Ancora un altro aggiornamento: Ecco un'altra cosa che ho cercato, suggerito da un utente sul forum di asp.net. Questo ha generato anche un errore del server interno di 500, quindi questo mi fa pensare che avere 2 istanze di <sessionState> non è qualcosa che è permesso.

<sessionState mode="SQLServer" 
       cookieless="false" 
       timeout="20" 
       sqlConnectionString="IBConnectionString"> 
</sessionState> 
<sessionState mode="SQLServer" 
       cookieless="false" 
       timeout="20" 
       sqlConnectionString="BackUpConnectionString"> 
</sessionState> 

Più: sessionState è stato modificato e il sito si comporta ancora come è stato, l'ConnectionString non deve avere nulla a che fare con il problema con il secondo database di perdere è seduta. Deve essere qualcosa nel codice che sta dietro, non riesco a pensare a cos'altro potrebbe essere sbagliato con web.config.

<sessionState mode="InProc" timeout="20"></sessionState> 

Abbiamo anche scoperto che la variabile di sessione è ancora lì, semplicemente non visualizzerà le informazioni dell'utente quando è collegato al back up di connessione al database.


Dopo molte discussioni e frustrazione, ho chiesto al mio capo quanto sia difficile potrebbe essere quella di combinare solo i database. Sebbene ci siano più di 2400 record nel database di backup, non c'è davvero altra opzione. Non prevedo che una soluzione venga da me in tempi brevi e ho già sprecato un mese su questo .... grazie a tutti per l'aiuto.

Se mai capisco qualcosa, tornerò e modificherò questo post!

+0

Tutte le variabili di sessione scompaiono? O sono solo alcuni? –

+0

Perché c'è incoerenza durante l'utilizzo di Session ("IB") o Session.Item ("IB")? – Pankaj

+0

L'incoerenza è nuova. Non funzionava con 'Session (" IB ")' quindi li ho cambiati tutti in 'Session.Item' quando ho letto di più su Sessions su msdn. Non devo averli fatti tutti. :/Ed è la 'Session (" IB ")' che sta scomparendo. Senza di esso, non può ottenere le variabili 'First_Name',' Last_Name' o 'Name'. – jlg

risposta

2

Prima di tutto, rimuovere il codice nella parte Init della pagina. È inutile.

In secondo luogo, perché si impostano i valori IB della sessione su True in porzioni del codice? Sta sovrascrivendo il numero di conto. Modificare sia ..

Session("IB") = True 

a

Session("IB") = args.Value 

O semplicemente non hanno nemmeno pasticciare con la sessione in quel point..it dovrebbe essere già impostata dal IBTextBoxButton_Click Sub routine.

+0

Questo è il problema con l'utilizzo di altri forum prima di StackOverflow ... La gente suggerire modifiche e poi StackOverflow mi dice che sono completamente inutili! hah – jlg

+1

Non posso dire che ogni suggerimento su StackOverflow (incluso il mio) sia sempre il migliore, ma questo è sempre un ottimo punto di partenza per le domande di programmazione. – N0Alias

+0

Ho apportato le modifiche suggerite ma la sessione continua a non rimanere quando vado in un'altra pagina. Ancora non lo rileva in 'Page_Load' – jlg

0

Assicurarsi che lo stato di sessione sia abilitato in web.config. Se è impostato su "StateServer" o "SQLServer", sostituirlo con "InProc" a scopo di test per escludere dipendenze esterne non riuscite.

<sessionState mode="InProc" /> 
+0

Siamo spiacenti, non ha pubblicato il web.config ma questo è quello che ho usato. Ecco perché è stato suggerito di cambiarlo in 'UseUri' – jlg

0

Inoltre, ho visto eccezioni gettate nel passato che sembravano "mangiare" la sessione. Cerca eventuali blocchi try/catch che potrebbero dare problemi.

Un singolo passaggio nel codice normalmente mostra i problemi, ma in caso contrario, una tecnica che uso a volte aiuta a sporcare il codice con i messaggi "io sono qui".

Il pensiero è che a volte aiuta innescare epifania quando si può vedere che la linea (o vicino ad esso) sembra essere la creazione del problema.

Ad esempio, è possibile scaricare uno stato variabile di sessione insieme a un numero di linea approssimativa e proprio output in diversi punti alla tua pagina web.

È inoltre dovrebbe cercare di limitare la quantità di codice si esegue il debug.

Se si riesce a isolare il problema per un insieme ridotto di codice, spesso questo aiuta problemi piatte.

** Modifica ** A quanto pare ero solo la scansione. Dopo aver effettivamente letto il tuo post, vedo che hai identificato la linea che causa il problema. Non vedo nulla di sbagliato con la linea, ma per qualche motivo voglio provare a utilizzare un nome di variabile di sessione diverso. Non so se ciò sarà di aiuto, ma è una cosa facile da provare. Forse usare un nome di variabile di sessione più lungo. Senza avere il debugger aperto di fronte a me, non so cos'altro controllare in cima alla mia testa.

+0

Ho cambiato il nome di' Session' in 'BAccount' e va dritto a' Nothing' quando faccio clic su un link per andare su un'altra pagina. Continuerò a cercare perché il mio 'Session' non viene salvato. Sarebbe bello se avessi solo 1 pagina nel mio sito .... – jlg

+0

Sì, è molto strano. Altre variabili di sessione stanno salvando ok? In tal caso, la sessione è archiviata in memoria o in un database? Se il database, può mettere una traccia sul database e assicurarsi che stia memorizzando la sessione. Potresti anche impostare un progetto separato con due pagine e testarlo lì. Potrebbe semplificare o mostrare un comportamento diverso. –

+0

'SessionState' è impostato su' InProc', dovrei provare una modalità diversa? Non sono sicuro di come funzionino tutti, ma appena ho letto sembra che potrei dover giocare presto con 'Modalità stato sessione '. – jlg

Problemi correlati