1

尝试运行我的代码时出现以下错误

Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.

根据 StackTrace,类 clUsuario 给了我错误:

[SerializationException: Type 'NaturaMexico.Satelite.clUsuario' in Assembly 'NaturaMexico.Satelite, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.]

但是该类被标记为可序列化,这里是:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.Serialization;
using System.Web;

namespace NaturaMexico.Satelite
{
    [Serializable]
    public class clUsuario : ISerializable 
    {
        public int ID_Usuario
        {
            get;
            set;
        }

        public string Nombre
        {
            get;
            set;
        }

        public int ID_Perfil
        {
            get;
            set;
        }

        public long NumeroCN
        {
            get;
            set;
        }

        public string Email
        {
            get;
            set;
        }

        public string Username
        {
            get;
            set;
        }

        public string Contrasena
        {
            get;
            set;
        }

        public bool Activo
        {
            get;
            set;
        }

        protected clUsuario(SerializationInfo info, StreamingContext context)
        {
            ID_Usuario = info.GetInt32("ID_Usuario");
            Nombre = info.GetString("Nombre");
            ID_Perfil = info.GetInt32("ID_Perfil");
            NumeroCN = info.GetInt64("NumeroCN");
            Email = info.GetString("Email");
            Username =info.GetString("Username");
            Contrasena = info.GetString("Contrasena");
            Activo = info.GetBoolean("Activo");
            email_contrasena = info.GetString("email_contrasena");
        }

        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("ID_Usuario", ID_Usuario);
            info.AddValue("Nombre", Nombre);
            info.AddValue("ID_Perfil", ID_Perfil);
            info.AddValue("NumeroCN", NumeroCN);
            info.AddValue("Email", Email);
            info.AddValue("Username", Username);
            info.AddValue("Contrasena", Contrasena);
            info.AddValue("Activo", Activo);
            info.AddValue("email_contrasena", email_contrasena);
        }

        /// <summary>
        /// Define los posibles tipos de ejecución del procedimiento almacenado
        /// </summary>
        private enum TipoEjecucion
        {
            Insercion =1,
            Edicion,
            Eliminacion,
            Consulta,
            CargaRegistros,
            CambiaContrasena,
            ConsultaPorUsername
        }

        /// <summary>
        /// Inicializa un objeto
        /// </summary>
        /// <param name="id_usuario"></param>
        public clUsuario(int id_usuario)
        {
            //Ejcutando el procedimiento y asignando propiedades
            using (DataSet ds = ejecutaProcedimientoAlmacenadoDataSet(TipoEjecucion.Consulta,id_usuario,"",0,0,"","","",0,true))
            {
                //Validando tabla
                if (clCapaNegocio.ValidaTablaDataset(ds, "Table",1))
                {
                    //Cargando los datos
                    this.ID_Usuario = ds.Tables["Table"].Rows[0].Field<int>("ID_Usuario");
                    this.Nombre = ds.Tables["Table"].Rows[0].Field<string>("Nombre");
                    this.ID_Perfil = ds.Tables["Table"].Rows[0].Field<int>("ID_Perfil");
                    this.NumeroCN = ds.Tables["Table"].Rows[0].Field<long>("Numero_CN");
                    this.Email = ds.Tables["Table"].Rows[0].Field<string>("Email");
                    this.Username = ds.Tables["Table"].Rows[0].Field<string>("Username");
                    this.Contrasena = Crypto.DecryptStringAES(ds.Tables["Table"].Rows[0].Field<string>("Contrasenna"), this.NumeroCN.ToString());
                    this.Activo = ds.Tables["Table"].Rows[0].Field<bool>("Activo");
                } 
            }
        }

        /// <summary>
        /// Inicializa un objeto
        /// </summary>
        /// <param name="username"></param>
        public clUsuario(string username)
        {
            //Ejcutando el procedimiento y asignando propiedades
            using (DataSet ds = ejecutaProcedimientoAlmacenadoDataSet(TipoEjecucion.ConsultaPorUsername, 0, "", 0, 0, "", username, "", 0, true))
            {
                //Validando tabla
                if (clCapaNegocio.ValidaTablaDataset(ds, "Table", 1))
                {
                    //Cargando los datos
                    this.ID_Usuario = ds.Tables["Table"].Rows[0].Field<int>("ID_Usuario");
                    this.Nombre = ds.Tables["Table"].Rows[0].Field<string>("Nombre");
                    this.ID_Perfil = ds.Tables["Table"].Rows[0].Field<int>("ID_Perfil");
                    this.NumeroCN = ds.Tables["Table"].Rows[0].Field<long>("Numero_CN");
                    this.Email = ds.Tables["Table"].Rows[0].Field<string>("Email");
                    this.Username = ds.Tables["Table"].Rows[0].Field<string>("Username");
                    this.Contrasena = ds.Tables["Table"].Rows[0].Field<string>("Contrasenna") == "" ?"": Crypto.DecryptStringAES(ds.Tables["Table"].Rows[0].Field<string>("Contrasenna"), this.NumeroCN.ToString());
                    this.Activo = ds.Tables["Table"].Rows[0].Field<bool>("Activo");
                }
            }
        }

        /// <summary>
        /// Actualiza la contraseña del objeto en la base de datos basado en las propiedades
        /// </summary>
        /// <param name="nueva_contrasena"></param>
        /// <returns></returns>
        public int CambiaContrasena(string nueva_contrasena)
        {
            //Variables a utilizar
            int resultado = 0;
            string contrasena_encriptada = "";

            //Encriptando la contraseña
            contrasena_encriptada = Crypto.EncryptStringAES(nueva_contrasena, this.NumeroCN.ToString());

            //Ejecutando el procedimiento almacenado
            resultado = ejecutaProcedimientoAlmacenado(TipoEjecucion.CambiaContrasena, this.ID_Usuario, this.Nombre, this.ID_Perfil, this.NumeroCN, this.Email, this.Username,
                            contrasena_encriptada, this.ID_Usuario, this.Activo);
            this.Contrasena = nueva_contrasena;

            //Regresando resultado
            return resultado;
        }

        /// <summary>
        /// Actualiza los valores del objeto en la base de datos basado en las propiedades
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public int ActualizaInformacion(int usuario)
        {
            //Variables a utilizar
            int resultado = 0;

            //Ejecutando el procedimiento almacenado
            resultado = ejecutaProcedimientoAlmacenado(TipoEjecucion.Edicion, this.ID_Usuario, this.Nombre, this.ID_Perfil, this.NumeroCN, this.Email, this.Username,
                            this.Contrasena, usuario, this.Activo);

            //Regresando resultado
            return resultado;
        }

        /// <summary>
        /// Inserta un nuevo registro y devuelve el objeto insertado
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="id_perfil"></param>
        /// <param name="numero_cn"></param>
        /// <param name="email"></param>
        /// <param name="username"></param>
        /// <param name="contrasena"></param>
        /// <param name="id_usuario_modifica"></param>
        /// <returns></returns>
        public static clUsuario InsertaUsuario(string nombre, int id_perfil, long numero_cn, string email, string username, string contrasena, int id_usuario_modifica)
        {
            //Variables a utilizar
            int resultado = 0;

            //Ejecutando el procedimiento almacenado
            resultado = ejecutaProcedimientoAlmacenado(TipoEjecucion.Insercion, 0, nombre, id_perfil, numero_cn, email, username, contrasena, id_usuario_modifica, true);

            //Regresando objeto insertado
            return new clUsuario(resultado);
        }

        /// <summary>
        /// Ejecuta el procedimiento almacenado correspondiente a la tabla
        /// </summary>
        /// <param name="tipo"></param>
        /// <param name="id_usuario"></param>
        /// <param name="nombre"></param>
        /// <param name="id_perfil"></param>
        /// <param name="numero_cn"></param>
        /// <param name="email"></param>
        /// <param name="username"></param>
        /// <param name="contrasena"></param>
        /// <param name="id_usuario_modifica"></param>
        /// <param name="activo"></param>
        /// <param name="parametro_extra1"></param>
        /// <param name="parametro_extra2"></param>
        /// <returns></returns>
        private static int ejecutaProcedimientoAlmacenado(TipoEjecucion tipo, int id_usuario, string nombre, int id_perfil, long numero_cn,
            string email, string username, string contrasena, int id_usuario_modifica, bool activo, string parametro_extra1 = "", string parametro_extra2 = "")
        {
            //Variables a utilizar
            int resultado = 0;

            //Declarando e inicializando parametros
            object[] parametros = {Convert.ToInt32(tipo),id_usuario,nombre,id_perfil,numero_cn,email,username,contrasena,id_usuario_modifica,activo,
                                      parametro_extra1, parametro_extra2};

            //Ejecutando el procedimiento
            resultado = Convert.ToInt32(clCapaDatos.Instancia.EjecutaScalar("SP_MA_Usuarios", parametros));
            return resultado;
        }

        /// <summary>
        /// Ejecuta el procedimiento almacenado de la tabla y devuelve un dataset
        /// </summary>
        /// <param name="tipo"></param>
        /// <param name="id_usuario"></param>
        /// <param name="nombre"></param>
        /// <param name="id_perfil"></param>
        /// <param name="numero_cn"></param>
        /// <param name="email"></param>
        /// <param name="username"></param>
        /// <param name="contrasena"></param>
        /// <param name="id_usuario_modifica"></param>
        /// <param name="activo"></param>
        /// <param name="parametro_extra1"></param>
        /// <param name="parametro_extra2"></param>
        /// <returns></returns>
        private static DataSet ejecutaProcedimientoAlmacenadoDataSet(TipoEjecucion tipo, int id_usuario, string nombre, int id_perfil, long numero_cn,
            string email, string username, string contrasena, int id_usuario_modifica, bool activo, string parametro_extra1 = "", string parametro_extra2 = "")
        {
            //Variables a utilizar
            DataSet resultado = new DataSet();

            //Declarando e inicializando parametros
            object[] parametros = {Convert.ToInt32(tipo),id_usuario,nombre,id_perfil,numero_cn,email,username,contrasena,id_usuario_modifica,activo,
                                      parametro_extra1, parametro_extra2};

            //Ejecutando el procedimiento
            resultado = clCapaDatos.Instancia.EjecutaDataset("SP_MA_Usuarios", parametros);
            return resultado;
        }

        public string GeneraContraseña(long numero_cn)
        {
            return System.Web.Security.Membership.GeneratePassword(15, 3) + numero_cn.ToString();
        }

        public bool EnviaContrasenaEmail()
        {
            //Enviando el email
            return clEmail.EnviaEmailPostMark("someome@someome.net", this.Email, "Envío de contraseña Mi Negocio",
                this.email_contrasena.Replace("{NOMBRE}",this.Nombre).Replace("{CONTRASEÑA}",this.Contrasena), true, "somekey");
        }

        private string email_contrasena = @"<table width='700' border='0' align='center' cellpadding='0' cellspacing='0' style='line-height: normal; border: #CCCCCC 1px solid'>
    <tr>
        <td width='700'>
            <img src='http://www.natura.com.mx/naturauploads//image/satelite_01.jpg' width='700' height='128' border='0' usemap='#Map5' style='display: block' /></td>
    </tr>
    <tr>
        <td>
            <img src='http://www.natura.com.mx/naturauploads//image/satelite_02.jpg' width='700' height='269' border='0' style='display: block' /></td>
    </tr>
    <tr>
        <td>
            <table width='700' border='0' cellspacing='0' cellpadding='0'>
                <tr>
                    <td width='19'>&nbsp;</td>
                    <td align='left' width='661' style='font-size: 22px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #37afc3;'>Querido(a) :{NOMBRE}</td>
                    <td width='20'>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td align='left' style='font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #464646;'>Es para nosotros un gusto informarte que a partir de este momento podr&aacute;s entrar al sitio <a href='http://minegocio.natura.com.mx' target='_blank' style='color: #37afc3'>http://minegocio.natura.com.mx</a> y consultar la informaci&oacute;n que necesitas para dar seguimiento a <strong>TU NEGOCIO</strong> aut&oacute;nomo y a las evoluciones en las reglas de la <strong>Red de Relaciones Sustentables</strong>.
        <br />
                        <br />
                        Te recordamos que tu usuario es tu n&uacute;mero de consultor.        </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td align='left' width='661' style='font-size: 16px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #f4812a;'>Tu contrase&ntilde;a es: </td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td align='left' width='661' style='font-size: 16px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #f4812a;'>{CONTRASEÑA}</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td align='left' style='font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #464646;'>Al entrar al sitio, te pedir&aacute; que actualices tu contrase&ntilde;a antes de poder navegar.
        <br />
                        <br />
                        <span style='background: #eceaea; padding: 10px; display: block'><strong>Si llegas a olvidarla, puedes recuperarla con alguna de las siguientes opciones:</strong><br />
                            <ol>
                                <li>Reenviar contrase&ntilde;a a tu correo electr&oacute;nico.</li>
                                <li>Responde tu pregunta secreta y te habilitar&aacute; la opci&oacute;n para cambiar la contrase&ntilde;a inmediatamente.</li>
                                <li>Si olvidaste tu email puedes actualizar tus datos (&uacute;nica vez) y al guardar los cambios te enviar&aacute; tu nueva contrase&ntilde;a a tu direcci&oacute;n de correo electr&oacute;nico.</li>
                                <li>Llamando al CAN para solicitar q te desbloqueen.</li>
                            </ol>
                        </span></td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td align='left' style='font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #464646;'>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>

                <tr>
                    <td>&nbsp;</td>
                    <td align='left' style='font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #464646;'>Esperamos que disfrutes navegar en este micrositio que fue creado pensando en ti.</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td align='left' style='font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #464646;'>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td align='left' style='font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #464646;'>Gracias,<br />
                        <strong>Natura M&eacute;xico</strong></td>
                    <td>&nbsp;</td>
                </tr>
            </table>
        </td>
    </tr>
    <tr>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td>
            <img src='http://www.natura.com.mx/naturauploads//image/satelite_03.jpg' width='700' height='140' border='0' usemap='#Map7' style='display: block' /></td>
    </tr>
</table>
<map name='Map' id='Map'>
    <area shape='rect' coords='392,12,464,50' href='https://www.facebook.com/Natura' target='_blank' />
    <area shape='rect' coords='573,16,657,48' href='http://www.youtube.com/naturamx' target='_blank' />
    <area shape='rect' coords='465,14,574,49' href='http://twitter.com/#!/Natura_Mexico' target='_blank' />
    <area shape='rect' coords='37,16,198,48' href='http://www.natura.com.mx/' target='_blank' />
    <area shape='rect' coords='77,45,78,46' href='#' />
</map>
<map name='Map5' id='Map5'>
    <area shape='rect' coords='465,52,547,71' href='http://www.natura.com.mx' target='_blank' />
    <area shape='rect' coords='559,52,677,69' href='http://www.natura.com.mx' target='_blank' />
    <area shape='rect' coords='626,10,652,38' href='http://twitter.com/natura_mx' target='_blank' />
    <area shape='rect' coords='653,10,681,37' href='http://www.youtube.com/naturamx' target='_blank' />
    <area shape='rect' coords='595,10,625,38' href='https://www.facebook.com/Natura' target='_blank' />
    <area shape='rect' coords='325,76,477,93' href='http://www.natura.com.mx/faq' target='_blank' />
    <area shape='rect' coords='480,75,547,94' href='http://www.natura.com.mx/Company/CompanyMain.aspx?PageId=584' target='_blank' />
    <area shape='rect' coords='225,72,317,91' href='http://www.natura.com.mx/social/blog/natura-mexico' target='_blank' />
    <area shape='rect' coords='34,8,152,115' href='http://www.natura.com.mx' target='_blank' />
    <area shape='rect' coords='561,72,687,93' href='http://www.natura.com.mx/Template1.aspx?PageId=299' target='_blank' />
</map>
<map name='Map2' id='Map2'>
    <area shape='rect' coords='331,20,522,45' href='mailto:naturadestaque@gmail.com' target='_blank' />
</map>
<map name='Map4' id='Map4'>
    <area shape='rect' coords='267,40,419,105' href='http://bit.ly/StlCSU' target='_blank' />
</map>
<map name='Map3' id='Map3'>
    <area shape='rect' coords='577,11,661,46' href='http://www.youtube.com/naturamx' target='_blank' />
    <area shape='rect' coords='461,14,566,42' href='http://twitter.com/natura_mx' target='_blank' />
    <area shape='rect' coords='388,14,454,43' href='https://www.facebook.com/Natura' target='_blank' />
    <area shape='rect' coords='48,14,217,43' href='http://www.natura.com.mx' />
</map>
<map name='Map8' id='Map8'>
    <area shape='rect' coords='570,74,655,107' href='http://www.youtube.com/naturamx' target='_blank' />
    <area shape='rect' coords='463,73,566,108' href='http://twitter.com/natura_mx' target='_blank' />
    <area shape='rect' coords='389,71,458,106' href='https://www.facebook.com/Natura' target='_blank' />
    <area shape='rect' coords='29,75,237,106' href='http://www.natura.com.mx' target='_blank' />
</map>
<map name='Map6' id='Map6'>
    <area shape='rect' coords='218,16,496,102' href='http://www.natura.com.mx/social/Account/CompleteLogin' target='_blank' />
</map>
<map name='Map7' id='Map7'>
    <area shape='rect' coords='461,67,576,91' href='http://201.149.12.214/SCFD_EMIBASE_WEB_BUZON_NATURA/Account/LogOn?ReturnUrl=/SCFD_EMIBASE_WEB_BUZON_NATURA/' target='_blank' />
    <area shape='rect' coords='232,68,453,90' href='http://www.natura.com.mx/Template1.aspx?PageId=330' target='_blank' />
    <area shape='rect' coords='388,27,460,62' href='https://www.facebook.com/Natura' target='_blank' />
    <area shape='rect' coords='12,34,172,58' href='http://www.natura.com.mx' target='_blank' />
    <area shape='rect' coords='573,29,660,62' href='http://www.youtube.com/naturamx' target='_blank' />
    <area shape='rect' coords='110,67,223,90' href='http://www.natura.com.mx/Template1.aspx?PageId=299' target='_blank' />
    <area shape='rect' coords='463,29,570,62' href='http://twitter.com/natura_mx' target='_blank' />
</map>
<map name='Map10' id='Map10'>
    <area shape='rect' coords='102,167,238,192' href='http://www.natura.com.mx/naturauploads/files/Simulador Ganancias Lider - v3(1).xlsx' target='_blank' />
</map>

<map name='Map9' id='Map9'>
    <area shape='rect' coords='174,5,544,70' href='http://www.natura.com.mx/social/Account/CompleteLogin' target='_blank' />
</map>
";

    }

}

请帮助我提前谢谢

4

1 回答 1

0

由于您已经覆盖了构造函数,因此您现在缺少一个公共无参数构造函数。这使您的课程不可反序列化。

不确定是否在将对象放入会话时检查对象将可反序列化的事实,但我想您应该尝试添加这个公共无参数构造函数,或者制作反序列化构造函数(这似乎没有用)上市。

附带说明一下,即使有可能,您也应该避免在方法名称 ( GeneraContraseña) 中使用非 ascii 字符。

于 2013-08-22T07:46:06.473 回答