以下の場合にセッションを保存すると、エラーが発生する可能性があります:
HttpContext.Current.Session.Abandon(); Response.Redirect(Request.Url.Scheme + "://" + Request.Url.Host);
エラーが発生すると、以下のメッセージがログに出力されます。
ERROR PostSessionEndPipeline failed. Exception: System.NullReferenceException Message: Object reference not set to an instance of an object. Source: Sitecore.Analytics at Sitecore.Analytics.Pipelines.CommitSession.SubmitSession.Process(CommitSessionPipelineArgs args) at (Object , Object[] ) at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain) at Sitecore.Analytics.Pipelines.CommitSession.CommitSessionPipeline.Run(CommitSessionPipelineArgs args) at Sitecore.Analytics.Pipelines.PostSessionEnd.CommitSession.Process(PostSessionEndArgs args) at (Object , Object[] ) at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain) at Sitecore.Pipelines.EndSession.PostSessionEndPipeline.Run(PostSessionEndArgs args) at Sitecore.Web.Application.RaiseSessionEndEvent(HttpApplication context)
WARN Session Submit has failed. Exception: System.InvalidOperationException Message: args.Session.Contact is not set. Source: Sitecore.Analytics at Sitecore.Analytics.Pipelines.SubmitSessionContext.RenumberInteractions.Process(SubmitSessionContextArgs args) at (Object , Object[] ) at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) at Sitecore.Pipelines.DefaultCorePipelineManager.Run(String pipelineName, PipelineArgs args, String pipelineDomain) at Sitecore.Analytics.Pipelines.SubmitSessionContext.SubmitSessionContextPipeline.Run(SubmitSessionContextArgs args) at Sitecore.Analytics.Data.HttpSessionContextManager.Submit(Session session) at Sitecore.Analytics.Pipelines.CommitSession.SubmitSession.Process(CommitSessionPipelineArgs args)
Sitecore Analyticsの必須要件の一つとして、全てのASP.NETリクエストのライフサイクル イベントを実行することが必要です。
ただし、このMicrosoft社の記事には、以下のように記載されています。
「endResponseパラメーターにtrueを指定する場合、このメソッドは元の要求にEndメソッドを呼び出し、元の要求にThreadAbortExceptionメソッドをスローし、完了時に例外をスローします。この例外は、Webアプリケーションのパフォーマンスに悪影響を及ぼすため、endResponseパラメーターにfalseを指定することをお勧めします。」
※英語版:"If you specify true for the endResponse parameter, this method calls the End method for the original request, which throws ThreadAbortException method for the original request, which throws an exception when it completes. This exception has a detrimental effect on Web application performance, which is why passing false for the endResponse parameter is recommended."
したがって、Response.Redirect() が呼び出されると(Redirectを呼び出すことは、後方のパラメーターをtrueに設定してRedirectを呼び出すことと同じです)、該当のリクエストは中止されます。この場合、必要なクリーンアップ ロジックが実行されず、前述の例外がスローされます。
この事象を解決するには、コードを以下のように変更してください。
HttpContext.Current.Session.Abandon(); Response.Redirect(Request.Url.Scheme + "://" + Request.Url.Host, false);