尝试运行我的代码时出现以下错误
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'> </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'> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </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á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ón que necesitas para dar seguimiento a <strong>TU NEGOCIO</strong> autó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úmero de consultor. </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td align='left' width='661' style='font-size: 16px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #f4812a;'>Tu contraseña es: </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td align='left' width='661' style='font-size: 16px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #f4812a;'>{CONTRASEÑA}</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td align='left' style='font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #464646;'>Al entrar al sitio, te pedirá que actualices tu contraseñ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ña a tu correo electrónico.</li>
<li>Responde tu pregunta secreta y te habilitará la opción para cambiar la contraseña inmediatamente.</li>
<li>Si olvidaste tu email puedes actualizar tus datos (única vez) y al guardar los cambios te enviará tu nueva contraseña a tu dirección de correo electrónico.</li>
<li>Llamando al CAN para solicitar q te desbloqueen.</li>
</ol>
</span></td>
<td> </td>
</tr>
<tr>
<td> </td>
<td align='left' style='font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #464646;'> </td>
<td> </td>
</tr>
<tr>
<td> </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> </td>
</tr>
<tr>
<td> </td>
<td align='left' style='font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #464646;'> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td align='left' style='font-size: 13px; font-family: Verdana, Arial, Helvetica, sans-serif; color: #464646;'>Gracias,<br />
<strong>Natura México</strong></td>
<td> </td>
</tr>
</table>
</td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </td>
</tr>
<tr>
<td> </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>
";
}
}
请帮助我提前谢谢