web-dev-qa-db-fra.com

Impossible de sérialiser l'état de la session

Lorsque je mets mon application sur un serveur Web et que je tente de me "connecter", l'erreur suivante apparaît:

Server Error in '/' Application.
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.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: 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.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the Origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[SerializationException: Type 'Gebruiker' in Assembly 'App_Code.qzuhycmn, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.]
   System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +9452985
   System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) +247
   System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +160
   System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +218
   System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +54
   System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +542
   System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +133
   System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1708

[HttpException (0x80004005): 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.]
   System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1793
   System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(Object value, BinaryWriter writer) +34
   System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter writer) +638
   System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData item, Stream stream) +244
   System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData item, Int32 initialStreamSize, Byte[]& buf, Int32& length, Boolean compressionEnabled) +67
   System.Web.SessionState.OutOfProcSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) +114
   System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) +807
   System.Web.SessionState.SessionStateModule.OnEndRequest(Object source, EventArgs eventArgs) +184
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75


Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1 

La seule chose que je fais là-bas avec Sessions est la suivante: 

  • Session ["Rechten"] = "GlobaalAdmin"; (Exemple) 
  • Session ["gebruikerid"] = txtID.Text; (l'identifiant avec lequel ils se connectent)
  • Et redirigez-les vers une autre page: Response.Redirect ("LoggedIn.aspx", true);
  • http://Pastebin.com/jZprwA8m (Mise en session du gebruiker)

Il y a eu de nombreux sujets sur ce problème mais aucun ne semble m'avoir aidé… .. Tout fonctionne localement, mais en ligne ça ne marche pas.

27
Schoof

Peut-on voir la classe "Gebruiker"? Là erreur semble assez simple. Gebruiker n'est pas attribué à Serializable et ne peut donc pas être placé dans les modes Session pour StateServer et SQLServer.

MODIFIER:

Après avoir examiné le code que vous avez lié, oui, c'est probablement parce que la classe n'est pas sérialisable. La classe générée LINQ doit être une classe partielle afin que vous puissiez implémenter votre propre classe partielle qui la marque comme étant Serializable et que les exigences de l'état de session seront alors satisfaites.

[Serializable()]
public partial class Gebruiker { //Lots of stuff }

EDIT 2:

Thomas, votre classe Gebruiker a probablement une définition qui ressemble à ceci maintenant (ou quelque chose de similaire)

namespace XYZ
{
   public partial class Gebruiker
}

Créez simplement un autre fichier de classe qui a le même espace de noms et définissez la classe avec l'attribut Serializable

namespace XYZ
{
  [Serializable()]
  public partial class Gebruiker{}
}

C'est tout ce dont vous avez besoin dans ce fichier. De cette manière, l'attribut sérialisable ne sera pas écrasé lors de la création de la classe Gebruiker générée par LINQ.

31
Khepri

La session normale est simplement stockée en mémoire, mais lorsque vous travaillez dans un environnement à charge équilibrée, vous ne pouvez pas compter sur le même serveur gérant les publications (postbacks), raison pour laquelle la session doit être stockée dans un mécanisme de session partagée, principalement SQL Server et StateServer. 

Cela peut être configuré dans machine.config ou à un endroit plus profond que l'appli web.config. Pourquoi ne pas être au courant d'un tel changement, mais cela pourrait expliquer votre exception soudaine lors du déploiement sur Internet. 

Comme mentionné dans une autre réponse et dans les commentaires, le problème se poserait alors lorsque l'objet de session n'est pas [Serializable]; pendant que vous travaillez en session normale, l'objet n'est pas sérialisé, mais simplement stocké dans la mémoire du serveur, mais la mise en ligne introduit différents mécanismes de session et la nécessité de sérialiser les objets.

6
faester

En fonction du code que vous avez publié: Cette classe est générée sous la forme partial; il vous suffit donc d'ajouter une autre définition partielle de ce type (dans le même espace de nom que la classe partielle générée):

[Serializable]
public partial class Gebruiker {}
1

Dans mon cas, j'essayais de sérialiser l'objet non sérialisé qui est HttpResponse. Donc, si les solutions fournies ne fonctionnent pas, vous pouvez passer par solution impossible pour sérialiser la session state article.

J'espère que ça aidera les autres!

0
Mayank Modi

Parfois, vous devez vérifier ci-dessous la propriété dans votre web.config

<sessionState mode="InProc" ........../>
0
Shakeer Hussain

Si SessionState mode = "SQLServer", vous devez utiliser [Serializable ()] Classe partielle publique Gebruiker.

sinon vous devez changer votre mode SessionState en "Inproc" Exemple:

0

Si vous rencontrez ce message d'erreur sur SharePoint 2013, n'oubliez pas d'exécuter l'applet de commande PowerShell suivante:

Enable-SPSessionStateService -DefaultProvision

Ce message d'erreur est nouveau dans SP2013; voir cette question pour SP2010: L’état de session ne peut être utilisé que si enableSessionState est défini sur true, que ce soit dans une configuration

0
Nacht

Il existe une autre solution. En héritant d'une classe non sérialisable, implémentez également la méthode GetObjectData de l'interface ISerlializable. La classe héritée doit également être marquée comme [Serializable].

0
vaibhav