Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lab Design

Sessions no ASPX

Recommended Posts

Seguinte: Eu to montando uma aplicação para fazer manutenção em várias databases: na realidade é um padrão que estamos adotando para todos os clientes as mesmas tabelas pois é o mesmo segmento.

Entao a aplicação mantem duas tabelas em nossos servidores que são o menu e usuários, as demais tabelas ficam no servidor de cada cliente.

Montei o seguinte:

 

no web.config aponto para a nossa database.

<connectionStrings>

<add name="RDSAString" connectionString="Data Source=sqlserver.brasnetec.com.br;Initial Catalog=msbrasnetec; User ID=usuario; password=senha" providerName="System.Data.SqlClient"/>

</connectionStrings>

no codebehind do login:

Session["usrId"] = (int)reader["idUsuario"];

Session["usrName"] = (string)reader["nome"];

Session["usrLevel"] = (int)reader["nivel"];

Session["cliId"] = (int)reader["idCliente"];

Session["logoEmpresa"] = (string)reader["logoEmpresa"];

Session["fantasia"] = (string)reader["fantasia"];

Session["urlSite"] = (string)reader["urlSite"];

Session["sqlUrl"] = (string)reader["sqlUrl"];

Session["sqlDataBase"] = (string)reader["sqlDataBase"];

Session["sqlUsr"] = (string)reader["sqlUsr"];

Session["sqlPwd"] = (string)reader["sqlPwd"];

Session["Stringconnection"] = "Data Source=" + (string)reader["sqlUrl"] + ";Initial Catalog=" + (string)reader["sqlDataBase"] + "; User ID=" + (string)reader["sqlUsr"] + "; password=" + (string)reader["sqlPwd"];

Response.Redirect("Default.aspx");

veja que ele salva em session diversos parametros recuperados da nossa database e consequentemente, monta a string de conexão apontando para a database do cliente conforme o login do usuario que é feito em nossa database.

 

a partir dai todo acesso a database é feito atraves de class no Add_Code sendo um class para cada tabela.

 

um class de exemplo:

using System;

using System.IO;

using System.Data;

using System.Data.SqlClient;

using System.Web.Configuration;

using System.Collections.Generic;

using System.Web;

 

namespace RDSA

{

 

///<summary>

///</summary>

[system.ComponentModel.DataObject]

public class Agenda

{

private static readonly string _connectionString;

 

/// <summary>

/// </summary>

static Agenda()

{

//_connectionString = WebConfigurationManager.ConnectionStrings["RDSAString"].ConnectionString;

_connectionString = HttpContext.Current.Session["Stringconnection"].ToString();

}

 

private int _idAgenda;

private string _data;

private string _descricao;

private string _dataReg;

 

public int idAgenda

{

get { return _idAgenda; }

set { _idAgenda = value; }

}

public string data

{

get { return _data; }

set { _data = value; }

}

public string descricao

{

get { return _descricao; }

set { _descricao = value; }

}

public string dataReg

{

get { return _dataReg; }

set { _dataReg = value; }

}

 

 

 

#region Methods

 

/// <summary>

/// preenche o SqlDataReader

/// </summary>

/// <param name="reader"></param>

public Agenda(SqlDataReader reader)

{

_idAgenda = (int)reader["idAgenda"];

_data = String.Format("{0:dd/MM/yyyy}", reader["data"]);

_descricao = (reader["descricao"] != DBNull.Value) ? (string)reader["descricao"] : null;

_dataReg = String.Format("{0:dd/MM/yyyy HH:mm:ss}", reader["dataReg"]);

}

 

 

///<summary>

///<summary></summary>

[system.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjec

tMethodType.Insert, false)]

public static int Insert(string data, string descricao)

{

//Initialize command

SqlConnection con = new SqlConnection(_connectionString);

SqlCommand cmd = new SqlCommand("RDSAAgenda_Insert", con);

cmd.CommandType = CommandType.StoredProcedure;

 

if (descricao == null) return (-9);

// Initialize parameters

DateTime _data = Convert.ToDateTime(data);

cmd.Parameters.AddWithValue("@data", _data);

cmd.Parameters.AddWithValue("@descricao", descricao);

int idAgenda = 0;

cmd.Parameters.AddWithValue("@idAgenda", idAgenda);

cmd.Parameters["@idAgenda"].Direction = ParameterDirection.Output;

 

using (con)

{

con.Open();

cmd.ExecuteNonQuery();

idAgenda = Convert.ToInt32(cmd.Parameters["@idAgenda"].Value.ToString());

return (idAgenda);

}

}

 

 

 

/// <summary>

/// Update um registro existente

/// </summary>

[system.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjec

tMethodType.Update, false)]

public static int Update(int idAgenda, string data, string descricao)

{

// Initialize command

SqlConnection con = new SqlConnection(_connectionString);

SqlCommand cmd = new SqlCommand("RDSAAgenda_Update", con);

cmd.CommandType = CommandType.StoredProcedure;

 

// Initialize parameters

if (descricao == null) return (-9);

 

cmd.Parameters.AddWithValue("@idAgenda", idAgenda);

DateTime _data = Convert.ToDateTime(data);

cmd.Parameters.AddWithValue("@data", _data);

cmd.Parameters.AddWithValue("@descricao", descricao);

 

using (con)

{

con.Open();

cmd.ExecuteNonQuery();

idAgenda = Convert.ToInt32(cmd.Parameters["@idAgenda"].Value.ToString());

return (idAgenda);

}

}

 

 

/// <summary>

/// Exclui um registro

/// </summary>

 

[system.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjec

tMethodType.Delete, false)]

public static int Delete(int idAgenda)

{

// Initialize command

SqlConnection con = new SqlConnection(_connectionString);

SqlCommand cmd = new SqlCommand("RDSAAgenda_Delete", con);

cmd.CommandType = CommandType.StoredProcedure;

 

// Initialize parameters

cmd.Parameters.AddWithValue("@idAgenda", idAgenda);

using (con)

{

con.Open();

cmd.ExecuteNonQuery();

idAgenda = Convert.ToInt32(cmd.Parameters["@idAgenda"].Value.ToString());

return (idAgenda);

}

}

 

 

 

/// <summary>

/// Seleciona todos os registros

/// </summary>

[system.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjec

tMethodType.Select, true)]

public static List<Agenda> Select(int idAgenda)

{

//Initialize command

SqlConnection con = new SqlConnection(_connectionString);

SqlCommand cmd = new SqlCommand("RDSAAgenda_Select", con);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@idAgenda", 0);

List<Agenda> results = new List<Agenda>();

using (con)

{

con.Open();

SqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())

results.Add(new Agenda(reader));

}

return results;

}

 

 

/// <summary>

/// Seleciona todos os registros

/// </summary>

[system.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjec

tMethodType.Select, true)]

public static List<Agenda> SelectById(int idAgenda)

{

//Initialize command

if (idAgenda == 0) return null;

SqlConnection con = new SqlConnection(_connectionString);

SqlCommand cmd = new SqlCommand("RDSAAgenda_Select", con);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@idAgenda", idAgenda);

List<Agenda> results = new List<Agenda>();

using (con)

{

con.Open();

SqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())

results.Add(new Agenda(reader));

}

return results;

}

 

#endregion

}

}

veja que neste ponto eu tenho que criar uma conexão:

static Agenda()

{

//_connectionString = WebConfigurationManager.ConnectionStrings["RDSAString"].ConnectionString;

_connectionString = HttpContext.Current.Session["Stringconnection"].ToString();

}

 

é montado a conexao de acordo com o valor guardado na Session["Stringconnection"] no momento do login.

 

Até ai funciona

 

no logoff:

Session.Remove("usrId");

Session.Remove("usrName");

Session.Remove("usrLevel");

Session.Remove("logoEmpresa");

Session.Remove("fantasia");

Session.Remove("urlSite");

Session.Remove("sqlUrl");

Session.Remove("sqlDataBase");

Session.Remove("sqlUsr");

Session.Remove("sqlPwd");

Session.Remove("Stringconnection");

 

Response.Redirect("~/Login.aspx?id=1");

eu mando remover todas as sessions criadas.

 

Aí é que entra o problema. Após o logoff e o novo login, algo acontece no ambiente que o valor de Stringconnection permance do primeiro login e portanto quando entro em qualquer class independente de logar como cliente a, b, ou c a Stringconnection continua apontando para o primeiro ou seja, o logoff não consegue remover a session.

 

Puts já tentei de tudo, usando no logoff o clear, o removeAll e nada a maldita continua la ferrando tudo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi amigo, eu ja tentei isso tambem.

 

Pior que fazendo um teste, logo apos o remove no codebehind ao tentar recuperar a session mostra o erro e objeto nao inicializado então o problema ta no class.

 

Não sei se é isso private static readonly string _connectionString; que nao deixa atualizar a variavel.

 

Mas eu resolvi de outra forma:

 

como ja tenho a connection montada em Session["Stringconnection"] ;

 

tive que colocar em todos os class o seguinte:

 

todas as linhas que tinha:

SqlConnection con = new SqlConnection(_connectionString);

 

passou para:

SqlConnection con = new SqlConnection(HttpContext.Current.Session["Stringconnection"].ToString());

 

dessa forma agora ta funcionando mas realmente nao consegui entender é alguma coisa relacionada ao class com certeza.

 

Mas valeu pela tentativa, brigadão.

 

Pra voce ter idéia do tamanho do abacaxi olha só.

 

Mesmo depois de compilado e publicado a aplicação, ao se logar ela apontava pra database errada, mesmo se fechando o browser e abrindo novamente continuava apontando pra database errada e pior ainda as vezes vinha a database A outras a B e assim por diante. Coisa de loko mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lab Design, vou mover seu tópico para o sub-fórum correto Plataforma .NET http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Web Applications ok.

 

Em relação sua dúvida, se você zerar a session na autenticação ja não resolve seus problemas?

 

Session["Stringconnection"] = null;

 

Caso não funcione tente um coisa do tipo:

 

1 - Faça a autenticação no browser IE como um cliente qualquer

2 - Faça a autenticação no browser Firefox como outro cliente qualquer

 

Depois disso, verifique se é a mesma connection string, se for seu problema pode estar nos métodos static, até aonde eu sei uma classe static compartilha instâncias na maquina virtual.

 

Da uma olhada nisso e manda pra gente ai.

 

Flwww, grande abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

oi sublyer

 

Realmente eu fiz isso inclusive testei na versão já publicada na locaweb. O que pude perceber é que a connection criada no class usando a var static _connetcion permanecia a mesma mesmo eu fechando e abrindo o browser novamente.

Eu acabei resolvendo de outra forma, em vez de usar o static connection criado dentro do class passei a usar o conteudo da session diretamente a linha que cria a conexão. Dessa forma não tinha como dar errado, já que o valor da session era alterado no momento do login pelo usuario, trazendo da database os parametros para a conexão do sql server.

 

É mais uma das armadilhas do C#.

 

Vou fazer um teste aqui depois nesta função pra ver:

private static readonly string _connectionString;

 

/// <summary>

/// </summary>

static Agenda()

{

//_connectionString = WebConfigurationManager.ConnectionStrings["RDSAString"].ConnectionString;

_connectionString = HttpContext.Current.Session["Stringconnection"].ToString();

}

 

 

Eu nao to fazendo uso dessa função to usando da seguinte forma:

 

[system.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjec

tMethodType.Select, true)]

public static List<Agenda> Select(int idAgenda)

{

//Initialize command

SqlConnection con = new SqlConnection(HttpContext.Current.Session["Stringconnection"].ToString());

SqlCommand cmd = new SqlCommand("RDSAAgenda_Select", con);

 

é como se Session e HttpContext.Current.Session fossem duas variaveis distintas.

Fiz outro teste removendo o HttpContext.Current.Session no codebehind do logoff mas também não surtiu efeito.

 

em outro teste eu removi a session no login e a aplicação continou funcionando do mesmo jeito ai deu um nó na minha cabeça.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.