Pergunta

Cenário - Estou escrevendo um aplicativo da Web com base na caixa de login que você usa (Database1 e Database2), ele o conectará ao banco de dados Coor isto. Eu configurei o web.config para manter as duas seqüências de conexão. No método on_authenticate de cada caixa, verifico autenticar o usuário e, em seguida, envio uma string com base na caixa de login para uma variável pública em uma classe chamada Authenticate User. Essa variável pública verifica o cookie e obtém o nome da string de conexão da variável, se o cookie for nulo, ele define um novo cookie, expira todos os cookies existentes e define os valores dos cookies.

Agora, uma vez feito isso, toda vez que clico no banco de dados (usando LINQ2SQL), crio um datacontext e envio em autenticateduser.connectionstring. Isso verificará o cookie e enviará a sequência de conexão para usar os dados. Herer é a aula de autenticação ...

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

}

Agora, isso parece estar trabalhando no primeiro clique do login. Quando digito as informações do usuário e passo pelo processo, posso ver o cookie que está definido/ no entanto, na primeira chamada de banco de dados verdadeira onde eu uso PortalDataContext db = new PortalDataContext(AuthenticatedUser.ConnectionString); Estou recebendo um erro de referência nula. Ele está passando pela obtenção e verifica o cookie e devolve um biscoito nulo. O que poderia estar acontecendo aqui?

Foi útil?

Solução

Você precisa adicionar o cookie à coleção Reponsonse.cookies ao configurá -la em vez da coleção Solicitação.Cookies. Somente os cookies na resposta são enviados de volta ao navegador do usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top