2010-09-29 1 views
0

Scenerio - я пишу веб-приложение, основанное на том, с какого поля входа вы используете (database1 и database2), он подключит вас к базе данных для совместного использования. Я установил web.config для хранения обеих строк соединения. В методе On_Authenticate каждого окна я проверяю аутентификацию пользователя, а затем отправляю строку на основе поля входа в общедоступную переменную в классе User Authenticate. Эта общедоступная переменная проверяет файл cookie и получает имя строки соединения из переменной, если cookie имеет значение null, он устанавливает новый файл cookie, истекает все существующие файлы cookie и устанавливает значения cookie.C# Cookie не сохраняет свою информацию

Теперь, когда это делается, каждый раз, когда я попадаю в базу данных (используя LINQ2SQL), я создаю datacontext и отправляю AuthenticatedUser.ConnectionString. Это проверит файл cookie и отправит строку подключения для использования данных. Herer является 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 = ""; 
    } 
} 

}

Теперь это, кажется, работает на первом клике от входа. Когда я ввожу информацию о пользователе, и я прохожу через процесс, я вижу cookie, который установлен/Однако в первом истинном вызове базы данных, где я использую PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString);. Я получаю ошибку нулевой ссылки. Он проходит через Get, и он проверяет файл cookie и возвращает нулевой файл cookie. Что здесь может быть?

ответ

1

Вам необходимо добавить файл cookie в коллекцию Reponse.Cookies при настройке вместо коллекции Request.Cookies. Только файлы cookie в ответе отправляются обратно в браузер пользователя.

+0

То, что я занимаюсь, это имя соединения, а не фактическая строка соединения. Я отправляю это имя в GetConnectionStringFromName(), чтобы получить строку соединения – EvanGWatkins

+0

@Evan - извините, я пропустил это. Итак, все, что вам нужно сделать, это сохранить cookie в ответе. – tvanfosson

+0

Спасибо, я не могу поверить, что я это смотрел. Благодаря! – EvanGWatkins