Вопрос

SCENERIO - я пишущую веб-приложение, которое основано на каком окне входа в систему, которое вы используете (база данных1 и базы данных2), он подключит вас к коре соответствующей базы данных. Я установил Web.config для удержания обеих соединительных строк. На методе ON_AUTHENTICTICITAL каждого поле я проверяю аутентификацию пользователя, а затем отправить строку на основе окна входа в публичную переменную в классе, называемом аутентифицирующим пользователем. Эта публичная переменная проверяет для файла cookie и получает имя строки подключения из переменной, если файл cookie null, он устанавливает новое cookie, истекает все существующие файлы cookie и устанавливает значения cookie.

Теперь, когда это сделано, каждый раз, когда я ударил в базу данных (используя Linq2SQL), я создаю DataContext и отправку в аутентификацию. Это проверит файлы cookie и отправьте заставить строку подключения для использования данных. HERER - класс аутентификации ...

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

}

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

Это было полезно?

Решение

Вам нужно добавить cookie в коллекцию reponse.cookies при настройке его вместо запроса. Только печенье в ответе отправляется обратно в браузер пользователя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top