Domanda

Scenerio - Sto Scrivendo una web app che in base al largo della quale casella di accesso si utilizza (database1 e database2) si collegherà al database cooresponding. Ho impostato il web.config per tenere entrambe le stringhe di connessione. Sul metodo On_Authenticate di ogni scatola verifico per autenticare l'utente e quindi inviare una stringa basata sulla scatola di accesso ad una variabile pubblica in una classe utente chiamato autenticazione. Questo pubblici ai controlli delle variabili per il cookie e prende il nome stringa di connessione dalla variabile, se il cookie è nullo, si imposta un nuovo cookie, scade tutti i cookie esistenti e imposta i valori dei cookie.

Ora, una volta fatto ciò, ogni volta che ha colpito il database (utilizzando LINQ2SQL) creo un DataContext e inviare AuthenticatedUser.ConnectionString. Questo controllerà il cookie e inviare ottenere la stringa di connessione da utilizzare per estrarre i dati. Herer è la classe AuthenticatedUser ...

public class AuthenticatedUser : System.Web.UI.Page
{
public static string ConnectionString
{
    get
    {
        HttpCookie myCookie = HttpContext.Current.Request.Cookies["connectionString"];
        return GetConnectionStringFromName(myCookie);
    }
    set
    {
        if (HttpContext.Current.Request.Cookies["connectionString"] != null)
        {
            ExpireCookies(HttpContext.Current);
        }
        var allCookies = HttpContext.Current.Request.Cookies.AllKeys;
        HttpCookie cookie = new HttpCookie("connectionString");
        cookie.Value = value;
        cookie.Expires = DateTime.Now.AddYears(100);
        HttpContext.Current.Request.Cookies.Add(cookie);
    }
}

private static string GetConnectionStringFromName(HttpCookie myCookie)
{
    string connectionStringName = myCookie.Value;
    return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
}

private static void ExpireCookies(HttpContext current)
{
    var allCookies = current.Request.Cookies.AllKeys;
    foreach (var cook in allCookies.Select(c => current.Response.Cookies[c]).Where(cook => cook != null))
    {
        cook.Value = "";
        cook.Expires = DateTime.Now.AddDays(-1);
        current.Request.Cookies.Remove(cook.Name);
        cook.Name = "";
    }
} 

}

Ora, questo sembra funzionare sul primo clic del login. Quando digito nelle informazioni utente e io passo attraverso il processo posso vedere il cookie che viene impostato / Tuttavia alla prima chiamata di database vero in cui io uso PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString); sto ottenendo un errore di riferimento null. Si sta attraversando il Get e controlla il cookie e restituisce un cookie null. Che cosa potrebbe essere succedendo qui?

È stato utile?

Soluzione

È necessario aggiungere il cookie alla collezione Response.Cookies quando si imposta al posto della collezione Request.Cookies. Solo i biscotti nella risposta vengono inviati al browser dell'utente.

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