2016-05-31 9 views
0

Ich habe ein benutzerdefiniertes Modul in Sitecore, das funktioniert, wenn App Pool Sitzungsstatus auf In process festgelegt ist. Wenn ich es zu SQL Server ändere, erhalte ich die Fehlermeldung, dass es nicht möglich ist, den Sitzungsstatus zu serialisieren. Alle meine Klassen, die ich verwende, sind serializable. Mein Code wird durch eine benutzerdefinierte Multifunktionsleisten-Schaltfläche ausgelöst und dieser Fehler wird ausgelöst, wenn ich darauf klicke. Es soll Dialogformular anzeigen, aber es zeigt stattdessen Fehlermeldung. Ich dachte, es hat etwas mit der Klasse Sitecore DialogForm zu tun, die meine Klasse erbt, aber es stellte sich heraus, dass dies nicht der Fall ist.Serialisierung in Sitecore

Wenn ich debuggen die Codefehler einmal ausgelöst wird Run(TranslateArgs args) Methode Ausführung beendet hat - aus public override void Execute(CommandContext context) aufgerufen und soll Dialog angezeigt werden durch den Aufruf SheerResponse.ShowModalDialog(str4.ToString(), true);

Ich dachte auch, dass es war, weil ich ClientPipelineArgs in Run Methode , aber nach dem Erstellen der benutzerdefinierten Klasse (und macht es serialisierbar), die erbt ClientPipelineArgs Fehler ist nicht weg.

Irgendwelche Ideen, was könnte es verursachen?

public override void Execute(CommandContext context) 
    { 
     try 
     { 
      Error.AssertObject(context, "context"); 
      if (context.Items.Length == 1) 
      { 
       Item item = context.Items[0]; 
       NameValueCollection parameters = new NameValueCollection(); 
       parameters["id"] = item.ID.ToString(); 
       parameters["language"] = item.Language.ToString(); 
       parameters["version"] = item.Version.ToString(); 

       var contentDatabase = item.Database; 
       Context.ClientPage.Start(this, "Run", parameters); 
      } 
     } 
     catch (Exception ex) 
     { 
      logger.Error(ex.StackTrace); 
     } 
    } 

    protected void Run(ClientPipelineArgs args) 
    { 
     try 
     { 
      string str = args.Parameters["id"]; 
      string name = args.Parameters["language"]; 
      string str3 = args.Parameters["version"]; 
      Item item = Context.ContentDatabase.Items[str, Language.Parse(name), Sitecore.Data.Version.Parse(str3)]; 
      Error.AssertItemFound(item); 
      if (SheerResponse.CheckModified()) 
      { 
       if (args.IsPostBack) 
       { 
        if (args.Result == "yes") 
        { 
         Context.ClientPage.SendMessage(this, "item:load(id=" + str + ",language=" + name + ",version=" + str3 + ")"); 
        } 
       } 
       else 
       { 
        UrlString str4 = new UrlString(UIUtil.GetUri("control:TranslateGL")); 
        str4.Add("id", item.ID.ToString()); 
        str4.Add("la", item.Language.ToString()); 
        str4.Add("vs", item.Version.ToString()); 
        str4.Add("ci", item.Language.ToString()); 
        if (IsValidSource(GetLocaleMap(), item.Language.ToString())) 
        { 
         SheerResponse.ShowModalDialog(str4.ToString(), true); 
        } 
        else 
        { 
         SheerResponse.Alert("Cannot export"); 
        } 
        args.WaitForPostBack(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      logger.Error(ex.StackTrace); 
     } 
    } 

Stack Trace:

[SerializationException: Typ 'Sitecore.Data.Database' in Versammlung Sitecore.Kernel, Version = 7.0.0.0, Culture = neutral, PublicKeyToken = null "ist nicht markiert als serializable.] System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers (Runtime Typ) 14210117 System.Runtime.Serialization.FormatterServices.GetSerializableMembers (Typ Typ, Streaming Kontext) +408 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo .InitMemberInfo() +420 System.Runtime.Serialization.Formatters.Bina ry.WriteObjectInfo.InitSerialize (Object-Objekt, ISurrogateSelector-SurrogatSelector, StreamingContext-Kontext, SerObjectInfoInit serObjectInfoInit, IFormatterConverter-Converter, ObjectWriter-ObjektWriter, SerializationBinder-Binder) +532 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write (WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) +969 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize (Objektdiagramm, Header [] in Header, __BinaryWriter serWriter, boolesches fCheck) +633 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (Stream serializationStream, Objektdiagramm, Header [] - Header, Boolean fCheck) +322 System.Web.Util.AltSerialization.WriteValueToStream (Objektwert, BinaryWriter-Schreiber) +1487

[HttpException (0x80004005): Der Sitzungsstatus konnte nicht serialisiert werden. Im Modus 'StateServer' und 'SQLServer' serialisiert ASP.NET die Sitzungsstatusobjekte, und daher sind nicht serialisierbare Objekte oder MarshalByRef-Objekte nicht zulässig. Dieselbe Einschränkung gilt, wenn der benutzerdefinierte Sitzungsspeicher im Modus 'Benutzerdefiniert' eine ähnliche Serialisierung durchführt.] System.Web.Util.AltSerialization.WriteValueToStream (Objektwert, BinaryWriter-Writer) +2252727 System.Web.SessionState.SessionStateItemCollection. WriteValueToStreamWithAssert (Objektwert, Binary Drehbuch) +49 System.Web.SessionState.SessionStateItemCollection.Serialize (Binary Drehbuch) 729 System.Web.SessionState.SessionStateUtility.Serialize (SessionStateStoreData Artikel, Stream Stream) +336 System.Web. SessionState.SessionStateUtility.SerializeStoreData (SessionStateStoreData-Element, Int32 initialStreamSize, Byte [] & buf, Int32 & Länge, Boolean compressionEnabled) +99 System.Web.SessionState.SqlSessionStateStore.SetAndReleaseItemExclusive (Httpcontext Kontext, String-ID, SessionStateStoreData Artikel, Object Lockid, Boolean newItem) 3538900 System.Web.SessionState.SessionStateModule.OnReleaseState (Object Quelle, EventArgs EventArgs) 1021 System.Web.SyncEventExecutionStep.System.Web.HttpApplication .IExecutionStep.Execute() +92 System.Web.HttpApplication.ExecuteStep (IExecutionStep Schritt, Boolean & completedSynchronously) +165

+0

Können Sie Ihren Code angeben? Vergewissern Sie sich, dass Sie keine anonymen Methoden haben. Dies könnte auch zu diesem Problem führen. – Anton

+0

Könnten Sie bitte den StackTrace bereitstellen? –

+0

Hinzugefügte Stack Trace – James

Antwort

-1

Derzeit out-of-Process-Sitzungszustandsmodus ist experimentelle Funktion in Sitecores. InProc ist die beste Option für den Client. Finden Sie mehr Details here. Wenn Sie immer noch denken, dass Out-of-Process der richtige Weg ist, stellen Sie sicher, dass Sie es in Übereinstimmung mit this Artikel einstellen.

+0

Die Artikel, auf die Sie Bezug nehmen, stammen aus den Jahren 2014 und 2015. Man könnte also meinen, dass es bereits implementiert wurde, seit es Fix in Update für v.7.5 eingeführt hat (das neueste ist 8.1 und ich bin auf 8.0). Die Konfiguration der Website gemäß der Anleitung hat das Problem jedoch nicht gelöst. – James

0

Nun die Stack-Trace sagt uns, dass einige Code versucht, eine Sitecore.Data.Database auf SessionState setzen, und das wird nicht funktionieren. Es hat keinen öffentlichen Konstruktor, aber das ist das geringste Problem. Dies kann passieren, wenn versucht wird, einen instanziierten Item auf SessionState zu setzen.

Der Stack-Trace scheint unvollständig zu sein. Es sollte Ihnen zeigen, welche Codezeile in Ihrer Run-Methode die Root-Quelle der Ausnahme ist.

Was mir nicht klar ist; Mit welcher Version von Sitecore sind Sie beschäftigt?

+0

Das ist alles, was es zu Stack Trace gibt - ich habe alles kopiert. Ich bin auf Sitecore 8.0. – James

Verwandte Themen