Question

Scenerio - J'ecrivais une application web qui basé sur de quelle boîte connexion que vous utilisez (database1 et database2), il vous connecter à la base de données cooresponding. J'ai mis le web.config de tenir les deux chaînes de connexion. Sur la méthode On_Authenticate de chaque case, je vérifie pour authentifier l'utilisateur, puis envoie une chaîne en fonction de la zone de connexion à une variable publique dans une classe appelée utilisateur Authentifier. Cette vérification des variables publiques pour le cookie et obtient le nom de chaîne de connexion de la variable, si le cookie est nul, il définit un nouveau, expire tous les cookies existants et définit les valeurs de cookie.

Maintenant, une fois que cela est fait, chaque fois que je frappe la base de données (à l'aide LINQ2SQL) Je crée un datacontext et envoyer AuthenticatedUser.ConnectionString. Cela vérifiera le cookie et envoyer obtenir la chaîne de connexion à utiliser pour extraire les données. Herer est 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 = "";
    }
} 

}

Maintenant, cela semble fonctionner sur le premier clic de la connexion. Quand je tape dans les informations de l'utilisateur et l'étape I à travers le processus que je peux voir le cookie qui est réglé / Cependant le premier véritable appel de base de données où j'utilise PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString); Je reçois une erreur de référence null. Il traverse le Get et il vérifie le cookie et retourne un cookie null. Que pourrait-on se passe ici?

Était-ce utile?

La solution

Vous devez ajouter le cookie à la collection Response.Cookies lors de la mise à la place de la collection Request.Cookies. Seuls les cookies dans la réponse sont renvoyés au navigateur de l'utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top