Невозможно сериализовать состояние сеанса - PullRequest
27 голосов
/ 05 мая 2011

При размещении приложения на веб-сервере и попытке входа в систему появляется следующая ошибка:

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; (идентификатор, с которым они входят)
  • И перенаправить их на другую страницу: Response.Redirect ("LoggedIn.aspx", true);
  • http://pastebin.com/jZprwA8m (перевод гебруикера в сессию)

Было несколько тем об этой проблеме, но ни одна из них, похоже, не помогла мне. Все работает локально, но онлайн - нет.

Ответы [ 8 ]

31 голосов
/ 05 мая 2011

Можем ли мы увидеть класс "Gebruiker"? Там ошибка кажется достаточно простой. Gebruiker не относится к Serializable, поэтому его нельзя помещать в Session для режимов StateServer и SQLServer.

EDIT:

После просмотра кода, на который вы ссылаетесь, да, возможно, это потому, что класс не сериализуем. Сгенерированный 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{}
}

Это все, что вам нужно в этом файле. Таким образом, атрибут serializable не будет перезаписан при создании сгенерированного LINQ класса Gebruiker.

6 голосов
/ 05 мая 2011

Обычный сеанс просто хранится в памяти, но когда вы работаете в среде с балансировкой нагрузки, вы не можете полагаться на один и тот же сервер, обрабатывающий обратные передачи, почему сеанс должен храниться в общем механизме сеанса, прежде всего в SQL Server и StateServer.

Это может быть настроено в machine.config или где-то глубже, чем приложение web.config, почему может не знать о таком изменении, но это может объяснить внезапное исключение при развертывании в Интернете.

Как уже упоминалось в другом ответе и в комментариях, проблема может возникнуть, когда объект сеанса не является [Сериализуемым];пока вы работаете в обычном сеансе, объект не сериализуется, а просто сохраняется в памяти сервера, но при подключении к Интернету появляются различные механизмы сеанса и необходимость сериализации объектов.

1 голос
/ 05 мая 2011

На основании кода, который вы разместили: этот класс генерируется как partial, поэтому все, что вам нужно сделать, это добавить другое частичное определение, подобное этому (в том же пространстве имен, что и сгенерированный частичный класс, конечно):

[Serializable]
public partial class Gebruiker {}
0 голосов
/ 31 января 2018

Если SessionState mode = "SQLServer", тогда вы должны использовать [Serializable ()] публичный частичный класс Gebruiker.

в противном случае вам придется изменить режим SessionState на "Inproc". Пример:

0 голосов
/ 30 ноября 2017

Иногда вам нужно проверить свойство ниже в вашем web.config

<sessionState mode="InProc" ........../>
0 голосов
/ 04 сентября 2014

В моем случае я пытался сериализовать несериализованный объект, который является HttpResponse. Поэтому, если предоставленные решения не будут работать, вы можете пройти через решение о невозможности сериализации состояния сеанса статья.

Надеюсь, что это поможет другим!

0 голосов
/ 24 сентября 2013

Если вы столкнулись с этим сообщением об ошибке в SharePoint 2013, не забудьте запустить следующий командлет PowerShell:

Enable-SPSessionStateService -DefaultProvision

Это сообщение об ошибке является новым в SP2013; см. этот вопрос для SP2010: Состояние сеанса можно использовать только в том случае, если для свойства enableSessionState установлено значение true, либо в конфигурации

0 голосов
/ 24 декабря 2012

Существует еще одно решение, хотя наследование несериализуемого класса также приводит к использованию метода GetObjectData интерфейса ISerlializable. Унаследованный класс также должен быть помечен как [Serializable].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...