///// <summary>
        ///// アクション メソッドの呼び出し前に呼び出されます。
        ///// Controller.OnActionExecuting メソッド (Microsoft.AspNetCore.Mvc)
        ///// https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.aspnetcore.mvc.controller.onactionexecuting
        ///// </summary>
        ///// <param name="filterContext">
        ///// 型: Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext
        ///// 現在の要求およびアクションに関する情報。
        ///// </param>
        //public override void OnActionExecuting(ActionExecutingContext filterContext)
        //{
        //    // OnActionExecutionAsyncに移行
        //}

        ///// <summary>
        ///// アクション メソッドの呼び出し後に呼び出されます。
        ///// Controller.OnActionExecuted メソッド (Microsoft.AspNetCore.Mvc)
        ///// https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.aspnetcore.mvc.controller.onActionexecuted
        ///// </summary>
        ///// <param name="filterContext">
        ///// 型: Microsoft.AspNetCore.Mvc.Filters.ActionExecutedContext
        ///// 現在の要求およびアクションに関する情報。
        ///// </param>
        //public override void OnActionExecuted(ActionExecutedContext filterContext)
        //{
        //    // OnActionExecutionAsyncに移行
        //}

        /// <summary>
        /// Controller.OnActionExecutionAsync メソッド (Microsoft.AspNetCore.Mvc)
        /// https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.aspnetcore.mvc.controller.onactionexecutionasync
        /// </summary>
        /// <param name="context">Filters.ActionExecutedContext</param>
        /// <param name="next">ActionExecutionDelegate</param>
        /// <returns>Task</returns>
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            #region OnActionExecuted に相当する処理

            // セッションタイムアウト検出処理

            // セッションタイムアウト検出処理の定義を取得
            string sessionTimeOutCheck =
                GetConfigParameter.GetConfigValue(FxLiteral.SESSION_TIMEOUT_CHECK);

            // デフォルト値対策:設定なし(null)の場合の扱いを決定
            if (sessionTimeOutCheck == null)
            {
                // OFF扱い
                sessionTimeOutCheck = FxLiteral.OFF;
            }

            // ON / OFF
            if (sessionTimeOutCheck.ToUpper() == FxLiteral.ON)
            {
                // セッションタイムアウト検出処理(ON)

                // セッション状態の確認
                if (MyHttpContext.Current.Session.IsAvailable &&
                    (!MyHttpContext.Current.Session.Keys.Any(key => key == "IsNewSession")))
                {
                    IRequestCookieCollection requestCookies  = MyHttpContext.Current.Request.Cookies;
                    IResponseCookies         responseCookies = MyHttpContext.Current.Response.Cookies;

                    // 新しいセッションが開始された
                    MyHttpContext.Current.Session.SetInt32("IsNewSession", 0);

                    // セッションタイムアウト検出用Cookieをチェック

                    if (!requestCookies.Keys.Any(key => key == FxHttpCookieIndex.SESSION_TIMEOUT))
                    {
                        // セッションタイムアウト検出用Cookie無し → 新規のアクセス

                        // セッションタイムアウト検出用Cookieを新規作成(値は空文字以外、何でも良い)
                        FxCmnFunction.CreateCookieForSessionTimeoutDetection();
                        MyHttpContext.Current.Session.SetString(FxHttpSessionIndex.DUMMY, "dummy");
                    }
                    else
                    {
                        // セッションタイムアウト検出用Cookie有り → セッションタイムアウトの可能性

                        if (string.IsNullOrEmpty(requestCookies.Get(FxHttpCookieIndex.SESSION_TIMEOUT)))
                        {
                            // セッションタイムアウト発生後の新規アクセス

                            // 値が消去されている(空文字に設定されている)場合は、
                            // 一度エラー or セッションタイムアウトになった後の新規のアクセスである。

                            // セッションタイムアウト検出用Cookieを再作成(値は空文字以外、何でも良い)
                            FxCmnFunction.CreateCookieForSessionTimeoutDetection();
                            MyHttpContext.Current.Session.SetString(FxHttpSessionIndex.DUMMY, "dummy");
                        }
                        else
                        {
                            // セッションタイムアウト発生

                            // セッションタイムアウト検出用Cookieを消去
                            // ASP.NETCoreの開発者例外ページには例外処理を差し込めないのでココに実装。
                            FxCmnFunction.DeleteCookieForSessionTimeoutDetection();

                            // セッションタイムアウト例外を発生させる
                            throw new FrameworkException(
                                      FrameworkExceptionMessage.SESSION_TIMEOUT[0],
                                      FrameworkExceptionMessage.SESSION_TIMEOUT[1]);
                        }
                    }
                }
                else
                {
                    // セッション継続中
                }
            }
            else if (sessionTimeOutCheck.ToUpper() == FxLiteral.OFF)
            {
                // セッションタイムアウト検出処理(OFF)
            }
            else
            {
                // パラメータ・エラー(書式不正)
                throw new FrameworkException(
                          FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_SWITCH1[0],
                          String.Format(FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_SWITCH1[1],
                                        FxLiteral.SESSION_TIMEOUT_CHECK));
            }

            #endregion

            await base.OnActionExecutionAsync(context, next);

            #region OnActionExecuted に相当する処理
            #endregion
        }
        /// <summary>
        /// アクション メソッドの呼び出し前に呼び出されます。
        /// Controller.OnActionExecuting メソッド (System.Web.Mvc)
        /// http://msdn.microsoft.com/ja-jp/library/system.web.mvc.controller.onactionexecuting.aspx
        /// </summary>
        /// <param name="filterContext">
        /// 型: System.Web.Mvc.ActionExecutingContext
        /// 現在の要求およびアクションに関する情報。
        /// </param>
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // Calling base class method.
            base.OnActionExecuting(filterContext);

            #region セッションタイムアウト検出処理

            // セッションタイムアウト検出処理の定義を取得
            string sessionTimeOutCheck =
                GetConfigParameter.GetConfigValue(FxLiteral.SESSION_TIMEOUT_CHECK);

            // デフォルト値対策:設定なし(null)の場合の扱いを決定
            if (sessionTimeOutCheck == null)
            {
                // OFF扱い
                sessionTimeOutCheck = FxLiteral.OFF;
            }

            // ON / OFF
            if (sessionTimeOutCheck.ToUpper() == FxLiteral.ON)
            {
                // セッションタイムアウト検出処理(ON)

                // セッション状態の確認
                if (Session.IsNewSession)
                {
                    // 新しいセッションが開始された

                    // セッションタイムアウト検出用Cookieをチェック
                    HttpCookie cookie = Request.Cookies.Get(FxHttpCookieIndex.SESSION_TIMEOUT);

                    if (cookie == null)
                    {
                        // セッションタイムアウト検出用Cookie無し → 新規のアクセス

                        // セッションタイムアウト検出用Cookieを新規作成(値は空文字以外、何でも良い)
                        Response.Cookies.Set(FxCmnFunction.CreateCookieForSessionTimeoutDetection());
                        Session[FxHttpSessionIndex.DUMMY] = "dummy";
                    }
                    else
                    {
                        // セッションタイムアウト検出用Cookie有り → セッションタイムアウトの可能性

                        if (cookie.Value == "")
                        {
                            // セッションタイムアウト発生後の新規アクセス

                            // 値が消去されている(空文字に設定されている)場合は、
                            // 一度エラー or セッションタイムアウトになった後の新規のアクセスである。

                            // セッションタイムアウト検出用Cookieを再作成(値は空文字以外、何でも良い)
                            Response.Cookies.Set(FxCmnFunction.CreateCookieForSessionTimeoutDetection());
                            Session[FxHttpSessionIndex.DUMMY] = "dummy";
                        }
                        else
                        {
                            // セッションタイムアウト発生

                            // エラー画面で以下の処理を実行する。
                            // ・セッションタイムアウト検出用Cookieを消去
                            // ・セッションを消去

                            // セッションタイムアウト例外を発生させる
                            throw new FrameworkException(
                                      FrameworkExceptionMessage.SESSION_TIMEOUT[0],
                                      FrameworkExceptionMessage.SESSION_TIMEOUT[1]);
                        }
                    }
                }
                else
                {
                    // セッション継続中
                }
            }
            else if (sessionTimeOutCheck.ToUpper() == FxLiteral.OFF)
            {
                // セッションタイムアウト検出処理(OFF)
            }
            else
            {
                // パラメータ・エラー(書式不正)
                throw new FrameworkException(
                          FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_SWITCH1[0],
                          String.Format(FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_SWITCH1[1],
                                        FxLiteral.SESSION_TIMEOUT_CHECK));
            }

            #endregion
        }