2016-05-31 108 views
0

我在Sitecore中有一個自定義模塊,如果應用程序池會話狀態設置爲In process,它可以正常工作。當我將其更改爲SQL Server時,出現錯誤消息,指出它無法序列化會話狀態。我使用的所有課程都是serializable。我的代碼是由自定義功能區按鈕觸發的,當點擊它時會引發此錯誤。它應該顯示對話框形式,但它會顯示錯誤消息。我認爲這與我的類繼承的Sitecore DialogForm類有關,但事實證明情況並非如此。在Sitecore中的序列化

當我調試的代碼引發錯誤一旦Run(TranslateArgs args)方法執行結束 - 它是從public override void Execute(CommandContext context)調用,應該通過調用SheerResponse.ShowModalDialog(str4.ToString(), true);

我也認爲這是因爲我在Run方法用於ClientPipelineArgs顯示對話框,但創建自定義類(並使其可序列化)後,繼承ClientPipelineArgs錯誤並沒有消失。

任何想法可能會導致它?

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); 
     } 
    } 

堆棧跟蹤:

[SerializationException:在安裝類型「Sitecore.Data.Database 'Sitecore.Kernel,版本= 7.0.0.0,文化=中立,公鑰=空' 未標記爲序列化的。] System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType型)14210117個 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(類型類型,的StreamingContext上下文)408 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo .InitMemberInfo()+420 System.Runtime.Serialization.Formatters.Bina ry.WriteObjectInfo.InitSerialize(Object obj,ISurrogateSelector surrogateSelector,StreamingContext context,SerObjectInfoInit serObjectInfoInit,IFormatterConverter converter,ObjectWriter objectWriter,SerializationBinder binder)+532 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo,NameInfo memberNameInfo, NameInfo typeNameInfo)+969 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph,Header [] inHeaders,__BinaryWriter serWriter,Boolean fCheck)+633 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (Stream serializationStream,Object graph,Header [] headers,Boolean fCheck)+322 System.Web.Util.AltSerialization.WriteValueToStream(Object value,BinaryWriter writer)+1487

[HttpException(0x80004005):無法序列化會話狀態。在'StateServer'和'SQLServer'模式下,ASP.NET將序列化會話狀態對象,因此不允許使用不可序列化的對象或MarshalByRef對象。如果自定義會話狀態存儲以「自定義」模式執行類似的序列化,則適用相同的限制。] System.Web.Util.AltSerialization.WriteValueToStream(Object value,BinaryWriter writer)+2252727 System.Web.SessionState.SessionStateItemCollection。 WriteValueToStreamWithAssert(Object value,BinaryWriter writer)+49 System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter writer)+729 System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData item,Stream stream)+336 System.Web。 SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData item,Int32 initialStreamSize,Byte [] & buf,Int32 & length,Boolean compressionEnabled)+99 System.Web.SessionState.SqlSessionStateStore。SetAndReleaseItemExclusive(HttpContext context,String id,SessionStateStoreData item,Object lockId,Boolean newItem)+3538900 System.Web.SessionState.SessionStateModule.OnReleaseState(Object source,EventArgs eventArgs)+1021 System.Web.SyncEventExecutionStep.System.Web.HttpApplication .IExecutionStep.Execute()92 System.Web.HttpApplication.ExecuteStep(IExecutionStep步驟,布爾& completedSynchronously)165

+0

你能提供你的代碼嗎?仔細檢查你沒有匿名方法,他們也可能導致這個問題。 – Anton

+0

您能否提供StackTrace? –

+0

已添加堆棧跟蹤 – James

回答

-1

目前外的過程會話狀態模式是在Sitecore的實驗功能。 InProc是客戶的最佳選擇。查找更多詳情here。 如果您仍然認爲進程外是正確的選擇,請確保按照this文章進行設置。

+0

您引用的文章來自2014年和2015年,所以人們可能會認爲自從他們在v.7.5更新中引入了修復程序(最新版本爲8.1,而我在8.0版本中)後,它已經實施。根據指導配置網站並沒有解決問題。 – James

0

那麼堆棧跟蹤告訴我們,有些代碼試圖將一個Sitecore.Data.Database放到SessionState上,那樣就行不通了。它沒有公共的構造函數,但這是問題的最小部分。如果試圖將實例化的Item加入到SessionState中,也會發生這種情況。

堆棧跟蹤看起來不完整。它應該告訴你,Run方法中的哪一行代碼是異常的根源。

什麼是不明白的; Sitecore的確切版本是你的嗎?

+0

這就是堆棧跟蹤 - 我將它全部複製。我在Sitecore 8.0上。 – James