none
Cadena de Conexión Estática RRS feed

  • Pregunta

  • Saludos

    Tengo una duda espero podamos aclararla.

    Por necesidad de integrar un servicio con un nuevo servicio que estoy desarrollando, tengo la siguiente confusión.

    El servicio que definí es cSeReclamo, en esta clase recupero del web.config datos de conexión a una base de datos postgresql. como veran esta clase tiene dos constructurores public cSeReclamo() { } y public cSeReclamo(string mLogin, string Passw)  cuando se loguea un usuario al sistema en este caso via web en la capa de presentación instancio de la siguiente forma en el action Login:

    Servicio.cSeReclamo Servicio = new Servicio.cSeReclamo(login.UserName, login.Password);

    El constructor lo crea y pone la variable de la cadena de conexion con los datos del usuario y password en static.

    Mi duda es la siguiente un usuario se loguea, por Ejemplo: login:ricardo password:12345 definira una cadena de conexion estatica de la siguiente forma: CadenaConexion = "Server=127.0.0.1;Port=5432;Database=db1;User Id=ricardo;Password=12345;";

    y como es estatica esta cadena de conexion podre llamar a la clase cSeReclamo desde otro controlador instanciando de la siguiente forma : public cSeReclamo(){} sin necesidad de pasar login y password y así podre llamar a métodos de este servicio donde necesite pasar la cadena de conexion.

    al ser estatica la cadena de conexión, si se loguea otro usuario al sistema web creará una cadena de conexión estatica: CadenaConexion = "Server=127.0.0.1;Port=5432;Database=db1;User Id=javier;Password=67890;"; en el servidor web habrá confusión? que cadena de conexión validará, o trabajará de forma separada con las variables estáticas?

    como podria solucionar en caso que valide una sola cadena de conexión de tal manera cuando se loguee algun usuario trabaje con la cadena de conexion que se define en el servicio?

    Espero podamos aclarar mi duda o confusión, adjunto la clase cSeReclamo

    namespace Credin.Servicio
    {
        public class cSeReclamo : IcSeReclamo
        {
            private string[] DatosCadena = WebConfigurationManager.AppSettings["Crd"].Split(';');        
            private static string CadenaConexion;
            private string Login;
    
            public cSeReclamo() { }
    
            public cSeReclamo(string mLogin, string Passw) {
                Login = mLogin;
                CadenaConexion = "Server=" + DatosCadena[0] + ";Port=" + DatosCadena[1] + ";Database=" + DatosCadena[2] + ";User Id=" + Login + ";Password=" + Passw + ";";
            }       
    
            public System.Data.DataTable RecuperaUsuarioLogin() {
                Crd.Administracion.Servicio.cServicio Servicio = new Crd.Administracion.Servicio.cServicio();
                string Mensaje = "";
                System.Data.DataTable dt = Servicio.RecuperaUsuarioLogin(CadenaConexion, Login, ref Mensaje);
                if (Mensaje == "")
                    return dt;
                else
                    return null;
            }
    
            public T RetornaEntidad<T>(ref string Mensaje, string Tabla, List<string> iListPk, object objEntidad)
            {
                Credin.Negocio.cNeCommon neEntidad = new Credin.Negocio.cNeCommon(CadenaConexion);
                object o = neEntidad.RetornaEntidad<T>(Tabla, iListPk, objEntidad);
                Mensaje = neEntidad.Mensaje;
                return (T)o;
            }
        }
    }

    lunes, 10 de diciembre de 2012 11:46

Respuestas

  • si es un desarrollo web descarta completamente el uso de static, ya que este se comporta como el objeto Application, o sea el valor que asignes a esa variable seran global al sitio, todos los usuario comparitan la misma informacion

    usa Session  para guardar datos solo para el usuario

    si estas en una clase usa

    HttpContext.Current.Session[]

    pero usa session para esta tarea y no variables static

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta ricardo_jal lunes, 10 de diciembre de 2012 14:16
    lunes, 10 de diciembre de 2012 12:09

Todas las respuestas

  • si es un desarrollo web descarta completamente el uso de static, ya que este se comporta como el objeto Application, o sea el valor que asignes a esa variable seran global al sitio, todos los usuario comparitan la misma informacion

    usa Session  para guardar datos solo para el usuario

    si estas en una clase usa

    HttpContext.Current.Session[]

    pero usa session para esta tarea y no variables static

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta ricardo_jal lunes, 10 de diciembre de 2012 14:16
    lunes, 10 de diciembre de 2012 12:09
  • Leandro gracias por tu colaboración
    quisira que me confirmes si estoy haciendo bien ya probé el código lo ejecuté y trabaja sin problemas nose si puedo agregar un poco de seguridad a esta sessión o como lo definí es lo correcto:

    En el constructor public cSeReclamo(string mLogin, string Passw){} defino la session y luego asigno a la variable CadenaConexion esto hace la primera vez cuando paso el login y password, luego cuando ya estoy en otro controlador instancio mi clase cSeReclamo de la siguiente forma:public cSeReclamo() {} y dentro de esta asigno a CadenaConexion la sessión, es la forma correcta de utilizarla? se puede agregar algo de seguridad? 

    public class cSeReclamo : IcSeReclamo
        {
            private string[] DatosCadena = WebConfigurationManager.AppSettings["Crd"].Split(';');        
            private string CadenaConexion;
            private string Login;
    
            public cSeReclamo() { 
                CadenaConexion = (string)HttpContext.Current.Session["Coneccion"];
            }
    
            public cSeReclamo(string mLogin, string Passw) {
                Login = mLogin;
                HttpContext.Current.Session["Coneccion"] = "Server=" + DatosCadena[0] + ";Port=" + DatosCadena[1] + ";Database=" + DatosCadena[2] + ";User Id=" + Login + ";Password=" + Passw + ";";
                CadenaConexion = (string)HttpContext.Current.Session["Coneccion"];
            }
    
            public System.Data.DataTable RecuperaUsuarioLogin() {
                Crd.Administracion.Servicio.cServicio Servicio = new Crd.Administracion.Servicio.cServicio();
                string Mensaje = "";
                System.Data.DataTable dt = Servicio.RecuperaUsuarioLogin(CadenaConexion, Login, ref Mensaje);
                if (Mensaje == "")
                    return dt;
                else
                    return null;
            }
    
            public T RetornaEntidad<T>(ref string Mensaje, string Tabla, List<string> iListPk, object objEntidad)
            {
                Credin.Negocio.cNeCommon neEntidad = new Credin.Negocio.cNeCommon(CadenaConexion);
                object o = neEntidad.RetornaEntidad<T>(Tabla, iListPk, objEntidad);
                Mensaje = neEntidad.Mensaje;
                return (T)o;
            }
        }

    lunes, 10 de diciembre de 2012 13:45
  • no necesitas usar esto

    private string[] DatosCadena = WebConfigurationManager.AppSettings["Crd"].Split(';');

    usa el

    SqlConnectionStringBuilder Class

    no necesitas armar toda la cadena de conexion completa

    -----

    el metodo RecuperaUsuarioLogin() veo que invoca a un servicio y devuelve un datatable, pero no veo que realices nada con esto, eso es raro

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 10 de diciembre de 2012 13:56