アプリケーションを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
私がセッションで行うことはこれだけです:
この問題については複数のトピックがありましたが、どれも私を助けてくれなかったようです。すべてがローカルで機能しますが、オンラインでは機能しません。
「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クラスが作成されるときに、シリアル化可能な属性は上書きされません。
通常のセッションは単にメモリに格納されますが、負荷分散環境で作業している場合、同じサーバーがポストバックを処理することに依存することはできません。
これはmachine.configまたはweb.configアプリよりも深い場所で構成できますが、なぜこのような変更に気付かないかもしれませんが、インターネットに展開するときの突然の例外を説明することができます。
別の回答およびコメントで述べたように、セッションオブジェクトが[Serializable]でない場合に問題が発生します。通常のセッションで作業している間、オブジェクトはシリアル化されず、サーバーメモリに格納されますが、オンラインになると異なるセッションメカニズムが発生し、オブジェクトをシリアル化する必要が生じます。
投稿したコードに基づいて、そのクラスはpartial
として生成されるため、このような別の部分定義を追加するだけです(もちろん、生成された部分クラスと同じ名前空間に):
[Serializable]
public partial class Gebruiker {}
私の場合、HttpResponse
であるシリアル化されていないオブジェクトをシリアル化しようとしました。そのため、提供されたソリューションが機能しない場合は、 セッション状態をシリアル化できないソリューション の記事をご覧ください。
それが他の人を助けることを願っています!
Web.configで以下のプロパティを確認する必要がある場合があります
<sessionState mode="InProc" ........../>
SessionState mode = "SQLServer"の場合、[Serializable()] public partial class Gebruikerを使用する必要があります。
そうでない場合は、SessionStateモードを「Inproc」に変更する必要があります。例:
SharePoint 2013でこのエラーメッセージが表示された場合は、次のPowerShellコマンドレットを実行することを忘れないでください。
Enable-SPSessionStateService -DefaultProvision
このエラーメッセージはSP2013で新しく追加されました。 SP2010の次の質問を参照してください: セッション状態は、enableSessionStateが構成でtrueに設定されている場合にのみ使用できます
別の解決策があります。非シリアル化可能なクラスを継承する一方で、ISerlializableインターフェイスのGetObjectDataメソッドも実装します。継承クラスも[Serializable]としてマークする必要があります。