ViewStateのクリーンアップに関する問題


概要

デフォルトの設定では、SitecoreクライアントのViewState情報は、サーバーのファイル システムに保存されます。

ViewStateファイルは、Sitecore XPのバックグラウンド ジョブによって、ディスクから定期的にクリーンアップされます。ユーザーがSitecoreクライアントに長時間ログインしている際に、セッションのViewStateファイルがディスクから削除されると、Sitecoreクライアントでの作業中に未処理の例外が発生することがあります。

例外1:

[ArgumentNullException]: Value cannot be null.
Parameter name: stream
at System.IO.StreamReader..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
at System.IO.StreamReader..ctor(Stream stream, Boolean detectEncodingFromByteOrderMarks)
at XamlPageStatePersister.Load()
at System.Web.UI.Page.LoadPageStateFromPersistenceMedium()
at System.Web.UI.Page.LoadAllState()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
[HttpUnhandledException]: Exception of type 'System.Web.HttpUnhandledException' was thrown.
at System.Web.UI.Page.HandleError(Exception e)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest()
at System.Web.UI.Page.ProcessRequest(HttpContext context)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

例外2:

[NullReferenceException: Object reference not set to an instance of an object.]
   Sitecore.Shell.Applications.ContentManager.ContentEditorForm.OnLoad(EventArgs e) +1495
 
[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) +0
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +1255
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +38
   Sitecore.Reflection.ReflectionUtil.InvokeMethod(MethodInfo method, Object[] parameters, Object obj) +91
   Sitecore.Web.UI.Sheer.ClientPage.OnLoad(EventArgs e) +332
   System.Web.UI.Control.LoadRecursive() +66
 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2428

例外3:

[ArgumentNullException: Value cannot be null.
Parameter name: inputString]
   System.Web.UI.ObjectStateFormatter.Deserialize(String inputString, Purpose purpose) +835
   System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) +22
   XamlPageStatePersister.Load() +155
   System.Web.UI.Page.LoadPageStateFromPersistenceMedium() +58
   System.Web.UI.Page.LoadAllState() +46
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2441

解決策

この問題を解決するには、ViewStateファイルの最長有効期間を、ユーザーがSitecoreクライアントにログインできる最大時間を超える値に設定します。

例:

<agent type="Sitecore.Tasks.CleanupAgent" method="Run" interval="06:00:00">
  <files hint="raw:AddCommand">
  <remove folder="$(dataFolder)/viewstate" pattern="*.txt" maxAge="2.00:00:00" recursive="true" />
  </files>
</agent>