Imansible serializzare lo stato della sessione

Quando ho inserito la mia domanda online e ho provato ad accedere, ho ricevuto questo errore:

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 

L’unica cosa che faccio lì con Sessions è questa:

  • Session [“Rechten”] = “GlobaalAdmin”; (esempio)
  • Session [“gebruikerid”] = txtID.Text; (l’ID con cui si collegano)
  • E reindirizzarli su un’altra pagina: Response.Redirect (“LoggedIn.aspx”, true);
  • http://pastebin.com/jZprwA8m (Mettere il gebruiker in una sessione)

Ci sono stati diversi argomenti su questo problema, ma nessuno di loro sembra aver aiutato me. Tutto funziona localmente, ma online no.

Possiamo vedere la class “Gebruiker”? L’errore sembra abbastanza semplice. Gebruiker non viene attribuito come serializzabile, pertanto non può essere inserito in modalità Session per StateServer e SQLServer.

MODIFICARE:

Dopo aver visto il codice che hai collegato, sì, probabilmente è perché la class non è serializzabile. La class generata da LINQ dovrebbe essere una class parziale in modo da poter implementare la propria class parziale che la contrassegna come serializzabile e quindi i requisiti della sessione verranno soddisfatti.

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

MODIFICA 2:

Thomas, la tua class Gebruiker probabilmente ha una definizione simile a questa ora (o qualcosa di simile)

 namespace XYZ { public partial class Gebruiker } 

Basta creare un altro file di class che abbia lo stesso spazio dei nomi e definire la class con l’attributo Serializable

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

Questo è tutto ciò di cui hai bisogno in questo file. In questo modo, l’attributo serializzabile non verrà sovrascritto quando viene creata la class Gebruiker generata da LINQ.

La sessione normale viene semplicemente archiviata in memoria, ma quando si lavora in un ambiente con bilanciamento del carico non è ansible fare affidamento sugli stessi postback di gestione del server perché la sessione deve essere archiviata in un meccanismo di sessione condiviso principalmente SQL Server e StateServer.

Questo può essere configurato in machine.config o in qualche punto più profondo rispetto all’app web.config, perché potrebbe non essere a conoscenza di tale cambiamento, ma potrebbe spiegare la tua improvvisa eccezione durante la distribuzione su Internet.

Come menzionato in un’altra risposta e nei commenti, il problema si presenterebbe quando l’object della sessione non è [Serializable]; mentre si sta lavorando in sessione normale, l’object non è serializzato ma appena archiviato nella memoria del server, ma andando in linea introduce diversi meccanismi di sessione e la necessità che gli oggetti siano serializzabili.

In base al codice che hai postato: quella class è generata come partial , quindi tutto ciò che devi fare è aggiungere un’altra definizione parziale come questa (nello stesso spazio dei nomi della class parziale generata, ovviamente):

 [Serializable] public partial class Gebruiker {} 

C’è un’altra soluzione, mentre ereditando una class non serializzabile implora anche il metodo GetObjectData dell’interfaccia ISerlializable. La class ereditata dovrebbe essere contrassegnata come [Serializable].

Se si incontra questo messaggio di errore in SharePoint 2013, non dimenticare di eseguire il seguente cmdlet di PowerShell:

 Enable-SPSessionStateService -DefaultProvision 

Questo messaggio di errore è nuovo in SP2013; vedere questa domanda per SP2010: lo stato della sessione può essere utilizzato solo quando enableSessionState è impostato su true in una configurazione

Nel mio caso, stavo cercando di serializzare l’object non serializzato che è HttpResponse . Pertanto, se le soluzioni fornite non funzioneranno, è ansible consultare la soluzione di non riuscire a serializzare l’ articolo sullo stato della sessione .

Spero che aiuti gli altri!

Alcune volte devi controllare la proprietà sottostante nel tuo web.config

  

Se SessionState mode = “SQLServer”, allora devi usare [Serializable ()] public class class Gebruiker.

altrimenti devi cambiare la tua modalità SessionState in “Inproc” Esempio: