web-dev-qa-db-ja.com

セッション状態をシリアル化できません

アプリケーションをWebサーバーに配置して「ログイン」しようとすると、次のエラーが表示されます。

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 

私がセッションで行うことはこれだけです:

  • Session ["Rechten"] = "GlobaalAdmin"; (例)
  • Session ["gebruikerid"] = txtID.Text; (ログインに使用するID)
  • そして、それらを別のページにリダイレクトします:Response.Redirect( "LoggedIn.aspx"、true);
  • http://Pastebin.com/jZprwA8m (gebruikerをセッションに入れる)

この問題については複数のトピックがありましたが、どれも私を助けてくれなかったようです。すべてがローカルで機能しますが、オンラインでは機能しません。

29
Schoof

「Gebruiker」クラスを見ることができますか?そこにエラーが十分に簡単に思えます。 GebruikerはSerializableであるとは見なされないため、StateServerおよびSQLServerモードのセッションに配置することはできません。

編集:

リンクしたコードを確認した後、はい、おそらくクラスがシリアル化できないためです。 LINQで生成されたクラスは部分クラスにする必要があります。これにより、Serializableとしてマークする独自の部分クラスを実装でき、セッション状態の要件が満たされます。

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

編集2:

トーマス、あなたのGebruikerクラスは、おそらく今すぐこのような定義を持っています(または同様のもの)

namespace XYZ
{
   public partial class Gebruiker
}

同じ名前空間を持つ別のクラスファイルを作成し、Serializable属性でクラスを定義するだけです。

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

このファイルで必要なのはそれだけです。このように、LINQで生成されたGebruikerクラスが作成されるときに、シリアル化可能な属性は上書きされません。

34
Khepri

通常のセッションは単にメモリに格納されますが、負荷分散環境で作業している場合、同じサーバーがポストバックを処理することに依存することはできません。

これはmachine.configまたはweb.configアプリよりも深い場所で構成できますが、なぜこのような変更に気付かないかもしれませんが、インターネットに展開するときの突然の例外を説明することができます。

別の回答およびコメントで述べたように、セッションオブジェクトが[Serializable]でない場合に問題が発生します。通常のセッションで作業している間、オブジェクトはシリアル化されず、サーバーメモリに格納されますが、オンラインになると異なるセッションメカニズムが発生し、オブジェクトをシリアル化する必要が生じます。

7
faester

投稿したコードに基づいて、そのクラスはpartialとして生成されるため、このような別の部分定義を追加するだけです(もちろん、生成された部分クラスと同じ名前空間に):

[Serializable]
public partial class Gebruiker {}
2

私の場合、HttpResponseであるシリアル化されていないオブジェクトをシリアル化しようとしました。そのため、提供されたソリューションが機能しない場合は、 セッション状態をシリアル化できないソリューション の記事をご覧ください。

それが他の人を助けることを願っています!

0
Mayank Modi

Web.configで以下のプロパティを確認する必要がある場合があります

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

SessionState mode = "SQLServer"の場合、[Serializable()] public partial class Gebruikerを使用する必要があります。

そうでない場合は、SessionStateモードを「Inproc」に変更する必要があります。例:

SharePoint 2013でこのエラーメッセージが表示された場合は、次のPowerShellコマンドレットを実行することを忘れないでください。

Enable-SPSessionStateService -DefaultProvision

このエラーメッセージはSP2013で新しく追加されました。 SP2010の次の質問を参照してください: セッション状態は、enableSessionStateが構成でtrueに設定されている場合にのみ使用できます

0
Nacht

別の解決策があります。非シリアル化可能なクラスを継承する一方で、ISerlializableインターフェイスのGetObjectDataメソッドも実装します。継承クラスも[Serializable]としてマークする必要があります。

0
vaibhav