Frage

Scenerio - Ich bin eine Web-App writting das, von dem Login-Feld Sie verwenden (database1 und database2) basiert off es wird Sie an die cooresponding Datenbank verbinden. Ich habe die web.config gesetzt beiden Verbindungszeichenfolgen zu halten. Auf der On_Authenticate Methode jeden Kontrollkästchen ich den Benutzer zu authentifizieren und dann einen String basierend auf der Login-Box auf eine öffentliche Variable in einer Klasse namens Authentifizieren Benutzer senden. Diese öffentliche Variable prüft, ob das Cookie und erhält die Verbindung string name aus der Variablen, wenn das Cookie null ist, setzt sie ein neues Cookie verfällt alle vorhandenen Cookies und setzt die Cookie-Werte.

Nun, wenn dies geschehen ist, schlug jedes Mal wenn ich die Datenbank (mit LINQ2SQL) erstelle ich eine Datacontext und sendet in AuthenticatedUser.ConnectionString. Dies wird das Cookie überprüfen und die Verbindungszeichenfolge, die Daten zu ziehen verwenden senden. Herer ist die AuthenticatedUser Klasse ...

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 = "";
    }
} 

}

Nun scheint dies von der Anmeldung auf dem ersten Klick zu arbeiten. Als ich in den Benutzerinformationen und ich Schritt durch den Prozess geben kann ich das Cookie sehen, die festgelegt ist / aber auf dem ersten Aufruf echten Datenbank, wo ich PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString); verwende ich bin einen Null-Referenz Fehler. Es wird durch die Get und überprüft er das Cookie und gibt einen Null-Cookie. Was hier los sein könnte?

War es hilfreich?

Lösung

Sie müssen das Cookie an die Response.Cookies Sammlung hinzuzufügen, wenn es statt der Request.Cookies Sammlung zu setzen. Nur die Cookies in der Antwort zurück an den Browser des Benutzers gesendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top