Ich versuche, einige Objekte in der Sitzung zu speichern (die einen StateServer verwendet), aber ich erhalte den Fehler "System.Web.HttpException: Der Sitzungsstatus kann nicht serialisiert werden. Im Modus" StateServer "und" SQLServer " "
Ich weiß, was die Fehlermeldung bedeutet, aber ich kann nicht herausfinden warum. Alle Klassen, die ich verwende, sind als serialisierbar gekennzeichnet, und ich kann das Objekt in und aus XML serialisieren und deserialisieren mit:
%Vor%Das funktioniert und wird auch serialisiert mit:
%Vor%Aber der Fehler wird ausgelöst, wenn Sie versuchen, es in der Sitzung zu speichern.
Hat jemand irgendwelche Ideen, was dieses Verhalten verursachen könnte?
BEARBEITEN:
Ich habe gerade entdeckt, dass diese Zeile den Fehler verursacht (alles wurde entfernt und wieder eingefügt)
%Vor%Wenn ich diese Eigenschaft "Item" auf "new RecordReference ()" setze, tritt der Fehler auf. Wenn es null ist, ist es in Ordnung.
Nun also, die Frage ist, warum kann der StateServer das nicht bewältigen? Es serialisiert in Ordnung, wenn es nach XML serialisiert wird ...
BEARBEITEN ...
Typ 'System.Xml.XmlElement' in Assembly 'System.Xml, Version = 2.0.0.0, Culture = Neutral, PublicKeyToken = b77a5c561934e089' ist nicht als serialisierbar gekennzeichnet.
..... Sagen wir, dass die Xml-Objekte in C # nicht serialisierbar sind ?! Glaubt jemand anderes, dass dies an Irren grenzt?
Ich habe also die Antwort auf die Frage gefunden, aber ich bin nicht glücklich darüber.
Grundsätzlich enthalten einige der Klassen, die ich verwende, XMLElements und XMLNodes (sie werden automatisch mit svcutil generiert). Aus irgendeinem Grund, aber es glaubt, dass es sie braucht.
Keine dieser XML-Klassen ist serialisierbar !! Bin ich der Einzige, der das als ein völliges Versagen dieser Objekte empfindet? Um diese Gruppe von Klassen in die Sitzung zu bekommen, muss ich sie in eine Zeichenfolge serialisieren und sie dann in der Sitzung speichern, die sie wiederum serialisiert. Also serialisiere ich es, damit es serialisiert wird .....!?
Ich bin nicht sicher, ob ich damit zufrieden bin, aber das war die Ursache meiner Probleme.
Im Stack-Trace sollte eine SerializationException angezeigt werden, die angibt, welche Klasse nicht serialisiert werden kann ...
%Vor%Beachten Sie, dass der Statusserver die binäre Serialisierung und nicht die XML-Serialisierung verwendet.
Benutze niemals InProc. Es ist so zuverlässig wie das Wetter oder ein Zimmergenosse zahlt ihren Anteil an der Miete pünktlich. Du weißt nie, wann es einfach ausfällt.
InProc verwendet verfügbare RAM-Ressourcen. Es wird wiederverwendet, wenn die Maschine RAM-Ressourcen für andere Aufgaben mit höherer Priorität benötigt. So könnte die Sitzungsinfo die 20 Minuten dauern oder was auch immer Sie dafür einstellen. Oder es könnte 2 Minuten dauern, wenn Sie 20 erwarten. Genau wie das Wetter, das Sie nie wissen. Es funktioniert alles gut in Dev, wo die Maschine nicht beschäftigt ist. Dann leben, Leute bekommen kostenlose Sachen aus dem Warenkorb, weil sie 0 Dollar an Paypal berechnet werden.
Wenn Sie Sitzungsinformationen verwenden möchten, ist der Statusserver der einfachste und schmerzfreieste Weg. Es ist auch fast kugelsicher. Ich habe es seit Jahren mit null Ausgaben verwendet. Sie können Ihre App neu erstellen, sie bereitstellen und die Benutzer verlieren die Sitzungsinformationen nicht und behalten so weiter, als wäre nie etwas passiert. Außerdem können Sie keine Cluster in anderen Webservern erstellen, wenn Sie InProc verwenden. Sie können mit StateServer ohne Probleme, weil es dafür gemacht wird. Soweit Objekte nicht serialisiert werden, wickle sie einfach in ein Objekt, das heißt. Zum Beispiel sind DataTables nicht serialisiert, aber ein DataSet ist serialisierbar.
Das Wichtigste ist, dass in Ihrer web.config der Modus für den Sitzungsstatus auf "InProc" eingestellt ist. Basierend auf der Fehlermeldung, die Sie erhalten, ändern Sie einfach das, um es zu beheben. Wenn weiterhin Probleme auftreten, vergewissern Sie sich, dass alle Ereignisse als nicht serialisierbar markiert sind.
Wie stewemegson sagte, finde heraus, welche Klasse die SerializationException ausgelöst hat.
%Vor%Suchen Sie in Ihrem Code nach der Klasse "SomethingOrOther" und vergewissern Sie sich, dass sie serialisierbar ist.
Eine Klasse in C # serialisierbar machen:
%Vor%Eine Klasse in VB.NET serialisierbar machen:
%Vor%Weitere Informationen zur XML-Serialisierung finden Sie in folgendem MSDN-Artikel:
Tags und Links c# asp.net serialization