/// <summary>
        /// B層の業務例外による異常終了の後処理を実装するUOCメソッド。
        /// </summary>
        /// <param name="parameterValue">引数クラス</param>
        /// <param name="returnValue">戻り値クラス</param>
        /// <param name="baEx">BusinessApplicationException</param>
        /// <remarks>業務コード親クラス1から利用される派生の末端</remarks>
        protected override void UOC_ABEND(BaseParameterValue parameterValue, BaseReturnValue returnValue, BusinessApplicationException baEx)
        {
            // 業務例外発生時の処理を実装
            // TODO:

            // nullチェック
            if (this.perfRec == null)
            {
                // なにもしない
            }
            else
            {
                // 性能測定終了
                this.perfRec.EndsPerformanceRecord();

                // ACCESSログ出力-----------------------------------------------

                MyParameterValue myPV = (MyParameterValue)parameterValue;

                // ------------
                // メッセージ部
                // ------------
                // ユーザ名, 画面名, コントロール名 メソッド名, 処理名
                // 処理時間(実行時間), 処理時間(CPU時間)
                // エラーメッセージID, エラーメッセージ等
                // ------------
                string strLogMessage =
                    "," + myPV.User.UserName +
                    "," + myPV.ScreenId +
                    "," + myPV.ControlId +
                    "," + myPV.MethodName +
                    "," + myPV.ActionType +
                    "," + this.perfRec.ExecTime +
                    "," + this.perfRec.CpuTime +
                    "," + baEx.messageID +
                    "," + baEx.Message; // baEX

                // Log4Netへログ出力
                LogIF.WarnLog("ACCESS", strLogMessage);
            }

            // -------------------------------------------------------------
        }
Example #2
0
        /// <summary>
        /// アクション メソッドの呼び出し前に発生します。
        /// https://msdn.microsoft.com/ja-jp/library/dn573278.aspx
        /// </summary>
        /// <param name="actionContext">HttpActionContext</param>
        /// <param name="cancellationToken">CancellationToken</param>
        public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            // Controller・Action名を取得する。
            this.GetControllerAndActionName(actionContext);

            // Claimを取得する。
            string userName, roles, scopes, ipAddress;

            MyBaseAsyncApiController.GetClaims(out userName, out roles, out scopes, out ipAddress);

            // 権限チェック ------------------------------------------------
            // ・・・
            // -------------------------------------------------------------

            // 閉塞チェック ------------------------------------------------
            // ・・・
            // -------------------------------------------------------------

            // 性能測定開始
            this.perfRec = new PerformanceRecorder();
            this.perfRec.StartsPerformanceRecord();

            // Calling base class method.
            await base.OnActionExecutingAsync(actionContext, cancellationToken);

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // ------------

            string strLogMessage =
                "," + userName +  //this.UserInfo.UserName +
                "," + ipAddress + //this.UserInfo.IPAddress +
                "," + "----->" +
                "," + this.ControllerName +
                "," + this.ActionName + "(OnActionExecuting)";

            LogIF.InfoLog("ACCESS", strLogMessage);
        }
Example #3
0
        // 2009/09/01 & 2009/09/25-end

        #endregion

        #region P層フレームワークの共通処理

        #region 開始 終了処理のUOCメソッド

        /// <summary>フレームワークの対象コントロールイベントの開始処理を実装</summary>
        /// <param name="fxEventArgs">イベントハンドラの共通引数</param>
        /// <remarks>画面コード親クラス1から利用される派生の末端</remarks>
        protected override void UOC_PreAction(FxEventArgs fxEventArgs)
        {
            // フレームワークの対象コントロールイベントの開始処理を実装する
            // TODO:

            // 認証ユーザ情報を取得する ------------------------------------
            this.GetUserInfo();

            // -------------------------------------------------------------

            // 権限チェック ------------------------------------------------
            // -------------------------------------------------------------

            // 閉塞チェック ------------------------------------------------
            // -------------------------------------------------------------

            // ACCESSログ出力 ----------------------------------------------

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // ------------
            string strLogMessage =
                "," + UserInfo.UserName +
                "," + Request.UserHostAddress +
                "," + "----->" +
                "," + this.ContentPageFileNoEx +
                "," + fxEventArgs.ButtonID;

            // Log4Netへログ出力
            LogIF.InfoLog("ACCESS", strLogMessage);

            // -------------------------------------------------------------

            // 性能測定開始
            this.perfRec = new PerformanceRecorder();
            this.perfRec.StartsPerformanceRecord();
        }
Example #4
0
        /// <summary>
        /// Sets Asynchronous Processing Service exception flag by checking prerequisites
        /// </summary>
        public void SetServiceException()
        {
            try
            {
                // Checks for successful connection to the database.
                AsyncProcessingServiceParameterValue asyncParameterValue = new AsyncProcessingServiceParameterValue("AsyncProcessingService", "TestConnection", "TestConnection", "SQL",
                                                                                                                    new MyUserInfo("AsyncProcessingService", "AsyncProcessingService"));
                LayerB layerB = new LayerB();
                layerB.DoBusinessLogic((BaseParameterValue)asyncParameterValue, DbEnum.IsolationLevelEnum.NoTransaction);

                // Asynchronous Processing Service initializes successfully without any errors
                this._isServiceException = false;
            }
            catch (Exception ex)
            {
                // Service Failed due to unexpected exception.
                this._isServiceException = true;
                LogIF.ErrorLog("ASYNC-SERVICE", string.Format(GetMessage.GetMessageDescription("E0000"), ex.Message.ToString()));
            }
        }
Example #5
0
        /// <summary>例外処理</summary>
        protected override void UOC_ABEND(Exception ex)
        {
            // 性能測定終了

            // イベント処理開始前にエラーが発生した場合は、
            // this.perfRecがnullの場合があるので、null対策コードを挿入する。
            if (this.perfRec == null)
            {
                // nullの場合、新しいインスタンスを生成し、性能測定開始。
                this.perfRec = new PerformanceRecorder();
                perfRec.StartsPerformanceRecord();
            }

            this.perfRec.EndsPerformanceRecord();

            // ACCESSログ出力-----------------------------------------------

            if (MyBaseAsyncFunc.CanOutPutLog)
            {
                // ------------
                // メッセージ部
                // ------------
                // ユーザ名, レイヤ, 画面名, コントロール名,
                // 処理時間(実行時間), 処理時間(CPU時間)
                // エラーメッセージ等
                // ------------
                string strLogMessage =
                    "," + "-" +
                    "," + "*-----" +
                    "," + this.UIElementName +
                    "," + this.AsyncFunc.Method.Name +
                    "," + this.perfRec.ExecTime +
                    "," + this.perfRec.CpuTime +
                    "," + ex.Message;

                // Log4Netへログ出力
                LogIF.WarnLog("ACCESS", strLogMessage);
            }

            // -------------------------------------------------------------
        }
        /// <summary>エラーログの出力</summary>
        /// <param name="exceptionContext">ExceptionContext</param>
        private void OutputErrorLog(ExceptionContext exceptionContext)
        {
            this.GetRouteData(exceptionContext.RouteData);

            // 内部で await するが、呼出し元は同期なので、結果として同期実行になる。
            this.GetUserInfoAsync();

            // 非同期ControllerのInnerException対策(底のExceptionを取得する)。
            Exception ex = exceptionContext.Exception;
            Exception bottomException = ex;

            while (bottomException.InnerException != null)
            {
                bottomException = bottomException.InnerException;
            }

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // ------------

            string strLogMessage =
                "," + (this.UserInfo != null ? this.UserInfo.UserName : "******") +
                "," + (this.UserInfo != null ? this.UserInfo.IPAddress : "null") +
                "," + "<-----" +
                "," + this.ControllerName +
                "," + this.ActionName + "(OnException)" +
                "," + //this.perfRec.ExecTime +
                "," + //this.perfRec.CpuTime +
                "," + GetExceptionMessageID(bottomException) +
                "," + bottomException.Message + "\r\n" +
                "," + bottomException.StackTrace + "\r\n" +
                "," + ex.ToString(); // Exception.ToString()はRootのExceptionに対して行なう。

            LogIF.ErrorLog("ACCESS", strLogMessage);
        }
Example #7
0
        /// <summary>エラーログの出力</summary>
        /// <param name="exceptionContext">HttpActionExecutedContext</param>
        private void OutputErrorLog(ExceptionContext exceptionContext)
        {
            // 非同期ControllerのInnerException対策(底のExceptionを取得する)。
            Exception ex = exceptionContext.Exception;
            Exception bottomException = ex;

            while (bottomException.InnerException != null)
            {
                bottomException = bottomException.InnerException;
            }

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // ------------

            // Claimを取得する。
            string userName, roles, scopes, ipAddress;

            MyBaseAsyncApiController.GetClaims(out userName, out roles, out scopes, out ipAddress);

            string strLogMessage =
                "," + userName +  // (this.UserInfo != null ? this.UserInfo.UserName : "******") +
                "," + ipAddress + //(this.UserInfo != null ? this.UserInfo.IPAddress : "null") +
                "," + "<-----" +
                "," + this.ControllerName +
                "," + this.ActionName + "(ExecuteExceptionFilterAsync)" +
                "," + //this.perfRec.ExecTime +
                "," + //this.perfRec.CpuTime +
                "," + GetExceptionMessageID(bottomException) +
                "," + bottomException.Message + "\r\n" +
                "," + bottomException.StackTrace + "\r\n" +
                "," + ex.ToString(); // Exception.ToString()はRootのExceptionに対して行なう。

            LogIF.ErrorLog("ACCESS", strLogMessage);
        }
Example #8
0
        /// <summary>
        ///  Stop the asynchronous service and Waits to complete all worker thread to complete.
        /// </summary>
        public void StopAsyncProcess()
        {
            // Breaks the infinite loop of Main thread.
            this._infiniteLoop = false;

            // Wait the end of the main thread.
            this._mainThread.Join();

            // Update stop command to all the running asynchronous task
            ApsParameterValue asyncParameterValue = new ApsParameterValue(
                "AsyncProcessingService", "StopAllTask", "StopAllTask", "SQL",
                new MyUserInfo("AsyncProcessingService", "AsyncProcessingService"));

            asyncParameterValue.StatusId  = (int)AsyncStatus.Processing;
            asyncParameterValue.CommandId = (int)AsyncCommand.Stop;

            ApsLayerB      layerB           = new ApsLayerB();
            ApsReturnValue asyncReturnValue = (ApsReturnValue)layerB.DoBusinessLogic(
                (BaseParameterValue)asyncParameterValue, DbEnum.IsolationLevelEnum.ReadCommitted);

            if (asyncReturnValue.ErrorFlag)
            {
                LogIF.ErrorLog("ASYNC-SERVICE",
                               "ErrorMessageID: " + asyncReturnValue.ErrorMessageID +
                               "ErrorMessage: " + asyncReturnValue.ErrorMessage);
            }

            // Wait for all worker thread to be complete
            LogIF.InfoLog("ASYNC-SERVICE", GetMessage.GetMessageDescription("I0004"));

            while (this._workerThreadCount != 0)
            {
                // Wait for the completion of the worker thread.
                Thread.Sleep(this._numberOfSeconds * 1000);
            }

            // Log after completing all worker threads
            LogIF.InfoLog("ASYNC-SERVICE", GetMessage.GetMessageDescription("I0008"));
        }
Example #9
0
        /// <summary>フレームワークの対象コントロールイベントの開始処理を実装</summary>
        /// <param name="rcFxEventArgs">イベントハンドラの共通引数</param>
        /// <remarks>画面コード親クラス1から利用される派生の末端</remarks>
        protected override void UOC_PreAction(RcFxEventArgs rcFxEventArgs)
        {
            // フレームワークの対象コントロールイベントの開始処理を実装する
            // TODO:

            // 権限チェック ------------------------------------------------
            // -------------------------------------------------------------

            // 閉塞チェック ------------------------------------------------
            // -------------------------------------------------------------

            // ACCESSログ出力 ----------------------------------------------

            if (MyBaseControllerWin.CanOutPutLog)
            {
                // ------------
                // メッセージ部
                // ------------
                // ユーザ名, レイヤ, 画面名, コントロール名,
                // 処理時間(実行時間), 処理時間(CPU時間)
                // エラーメッセージID, エラーメッセージ等
                // ------------
                string strLogMessage =
                    "," + UserInfo.UserName +
                    "," + "----->" +
                    "," + this.Name +
                    "," + rcFxEventArgs.ControlName;

                // Log4Netへログ出力
                LogIF.InfoLog("ACCESS", strLogMessage);
            }

            // -------------------------------------------------------------

            // 性能測定開始
            this.perfRec = new PerformanceRecorder();
            this.perfRec.StartsPerformanceRecord();
        }
Example #10
0
        /// <summary>MySQLLogForEx</summary>
        /// <param name="log">string</param>
        public static void MySQLLogForEx(Exception ex)
        {
            if (ASPNETIdentityConfig.IsDebug)
            {
                // デバッグ時
                Debug.WriteLine(ex.ToString());
                LogIF.DebugLog("SQLTRACE", ex.ToString());
            }
            else
            {
                // プロビジョニング、プロダクト環境
                LogIF.DebugLog("SQLTRACE", ex.ToString());
            }

            if (ex is StopUserStoreException)
            {
                // ユーザストアを停止させる例外

                // スタックトレースを保って ex を throw
                //string trace = Environment.StackTrace;
                ExceptionDispatchInfo.Capture(ex).Throw();
            }
        }
Example #11
0
        ///////////////////////////////////////////////////////////////////
        // ページの実行が⑥~⑦の間に入る。
        ///////////////////////////////////////////////////////////////////

        /// <summary>
        /// ⑦ ページの実行を完了した直後に発生
        /// </summary>
        void Application_OnPostRequestHandlerExecute(object sender, EventArgs e)
        {
            // nullチェック
            if (this.perfRec == null)
            {
                // なにもしない
            }
            else
            {
                // 性能測定終了
                this.perfRec.EndsPerformanceRecord();

                // ACCESSログ出力-----------------------------------------------

                // ------------
                // Message部
                // ------------
                // ユーザ名, IPアドレス, レイヤ,
                // 画面名, Control名, メソッド名, 処理名
                // 処理時間(実行時間), 処理時間(CPU時間)
                // ------------
                string strLogMessage =
                    "," + "-" +
                    "," + Request.UserHostAddress +
                    "," + "-----↑" +
                    "," + "Global.asax" +
                    "," + "Application_OnPostRequest" +
                    "," + "-" +
                    "," + "-" +
                    "," + this.perfRec.ExecTime +
                    "," + this.perfRec.CpuTime;

                // Log4Netへログ出力
                LogIF.DebugLog("ACCESS", strLogMessage);
            }
        }
Example #12
0
        /// <summary>フレームワークの対象コントロールイベントの終了処理を実装</summary>
        /// <param name="fxEventArgs">イベントハンドラの共通引数</param>
        /// <remarks>画面コード親クラス1から利用される派生の末端</remarks>
        protected override void UOC_AfterAction(FxEventArgs fxEventArgs)
        {
            // フレームワークの対象コントロールイベントの終了処理を実装する
            // TODO:

            // 性能測定終了
            this.perfRec.EndsPerformanceRecord();

            // 認証ユーザ情報を取得する ------------------------------------
            this.GetUserInfo();

            // ACCESSログ出力 ----------------------------------------------

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // ------------
            string strLogMessage =
                "," + UserInfo.UserName +
                "," + Request.UserHostAddress +
                "," + "<-----" +
                "," + this.ContentPageFileNoEx +
                "," + fxEventArgs.ButtonID +
                "," + "" +
                "," + perfRec.ExecTime +
                "," + perfRec.CpuTime;

            // Log4Netへログ出力
            LogIF.InfoLog("ACCESS", strLogMessage);

            // -------------------------------------------------------------
        }
Example #13
0
        /// <summary>
        /// ⑥ ページの実行を開始する直前に発生
        /// </summary>
        void Application_OnPreRequestHandlerExecute(object sender, EventArgs e)
        {
            // ------------
            // Message部
            // ------------
            // ユーザ名, IPアドレス, レイヤ,
            // 画面名, Control名, メソッド名, 処理名
            // ------------
            string strLogMessage =
                "," + "-" +
                "," + Request.UserHostAddress +
                "," + "-----↓" +
                "," + "Global.asax" +
                "," + "Application_OnPreRequest";

            // Log4Netへログ出力
            LogIF.DebugLog("ACCESS", strLogMessage);

            // -------------------------------------------------------------

            // 性能測定開始
            this.perfRec = new PerformanceRecorder();
            this.perfRec.StartsPerformanceRecord();
        }
Example #14
0
        /// <summary>業務例外発生時の処理を実装</summary>
        /// <param name="baEx">BusinessApplicationException</param>
        /// <param name="fxEventArgs">イベントハンドラの共通引数</param>
        /// <remarks>画面コード親クラス1から利用される派生の末端</remarks>
        protected override void UOC_ABEND(BusinessApplicationException baEx, FxEventArgs fxEventArgs)
        {
            // 業務例外発生時の処理を実装
            // TODO:

            // ここに、メッセージの組み立てロジックを実装する。

            // メッセージ編集処理 ------------------------------------------

            string messageID          = baEx.messageID;
            string messageDescription = "";

            // メッセージIDから、対応するメッセージを取得する。
            messageDescription = GetMessage.GetMessageDescription(messageID);
            if (messageDescription == "")
            {
                // メッセージが取得できなかった場合
                messageDescription = baEx.Message;
            }
            else
            {
                // メッセージが取得できた場合、
                // 必要なら、メッセージに、可変文字列を組み込む。

                // 方式は、プロジェクト毎に検討のこと。
                messageDescription = messageDescription.Replace("%1", baEx.Message);
                messageDescription = messageDescription.Replace("%2", baEx.Information);
            }

            // -------------------------------------------------------------

            // メッセージ表示処理 ------------------------------------------

            #region メッセージボックスを使用して表示する場合。

            // 「OK」メッセージダイアログの表示処理
            this.ShowOKMessageDialog(
                messageID, messageDescription,
                FxEnum.IconType.Exclamation,
                "BusinessApplicationExceptionを使用したダイアログ表示");

            #endregion

            #region マスタ ページ上のラベルに表示する場合。

            //// 結果表示するメッセージ エリア
            //Label label = (Label)this.GetMasterWebControl("Label1");
            //label.Text = "";

            //// 結果(業務続行可能なエラー)
            //label.Text = "ErrorMessageID:" + baEx.messageID + "\r\n";
            //label.Text += "ErrorMessage:" + baEx.Message + "\r\n";
            //label.Text += "ErrorInfo:" + baEx.Information + "\r\n";

            #endregion

            // -------------------------------------------------------------

            // 性能測定終了

            // イベント処理開始前にエラーが発生した場合は、
            // this.perfRecがnullの場合があるので、null対策コードを挿入する。
            if (this.perfRec == null)
            {
                // nullの場合、新しいインスタンスを生成し、性能測定開始。
                this.perfRec = new PerformanceRecorder();
                perfRec.StartsPerformanceRecord();
            }

            this.perfRec.EndsPerformanceRecord();

            // 認証ユーザ情報を取得する ------------------------------------
            this.GetUserInfo();

            // ACCESSログ出力-----------------------------------------------

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // ------------
            string strLogMessage =
                "," + UserInfo.UserName +
                "," + Request.UserHostAddress +
                "," + "<-----" +
                "," + this.ContentPageFileNoEx +
                "," + fxEventArgs.ButtonID +
                "," + "" +
                "," + this.perfRec.ExecTime +
                "," + this.perfRec.CpuTime +
                "," + baEx.messageID +
                "," + baEx.Message;

            // Log4Netへログ出力
            LogIF.WarnLog("ACCESS", strLogMessage);

            // -------------------------------------------------------------
        }
Example #15
0
        /// <summary>WCF サービス本体</summary>
        /// <param name="param">REST 形式で送信された引数(ParamDataContract)</param>
        /// <returns>REST 形式で送信される戻り値(ReturnDataContract)</returns>
        private ReturnDataContract Call(ParamDataContract param)
        {
            // ステータス
            string status = "-";

            // 戻り値
            ReturnDataContract retValue = new ReturnDataContract();

            #region 呼出し制御関係の変数

            // アセンブリ名
            string assemblyName = "";

            // クラス名
            string className = "";

            #endregion

            #region 引数・戻り値関係の変数

            // 引数・戻り値の.NETオブジェクト
            MuParameterValue muParameterValue = null;
            MuReturnValue    muReturnValue    = null;

            // エラー情報(ログ出力用)
            string errorType      = ""; // 2009/09/15-この行
            string errorMessageID = "";
            string errorMessage   = "";
            string errorToString  = "";

            #endregion

            try
            {
                // 開始ログの出力
                LogIF.InfoLog("SERVICE-IF", FxLiteral.SIF_STATUS_START);

                #region  前解決

                // ★
                status = FxLiteral.SIF_STATUS_NAME_SERVICE;

                // 名前解決(インプロセス)
                ServiceForRt.IPR_NS.NameResolution(param.ServiceName, out assemblyName, out className);

                #endregion

                #region 引数の.NETオブジェクト化(UOC)

                // ★
                status = FxLiteral.SIF_STATUS_DESERIALIZE;

                // ★★ 引数の.NETオブジェクト化をUOCする(必要に応じて)。

                // 引数文字列の.NETオブジェクト化

                // クライアントの IP アドレス
                string IpAddress = string.Empty;

                // クライアントの IP アドレスを取得
                OperationContext context = OperationContext.Current;
                if (context.IncomingMessageProperties.ContainsKey(RemoteEndpointMessageProperty.Name) == true)
                {
                    RemoteEndpointMessageProperty property = (RemoteEndpointMessageProperty)context.IncomingMessageProperties[RemoteEndpointMessageProperty.Name];
                    IpAddress = property.Address;
                }

                // ParamDataContractを使用して初期化するなど
                muParameterValue = new MuParameterValue(
                    param.ScreenId == null ? string.Empty : param.ScreenId,     // 画面名
                    param.ControlId == null ? string.Empty : param.ControlId,   // ボタン名
                    param.MethodName == null ? string.Empty : param.MethodName, // メソッド名
                    param.ActionType == null ? string.Empty : param.ActionType, // アクションタイプ
                    new MyUserInfo(param.UserName, IpAddress));

                // ParameterValueを引数のBeanフィールドに設定
                muParameterValue.Bean = param.Info;

                // 引数クラスをパラメタ セットに格納
                object[] paramSet = new object[] { muParameterValue, DbEnum.IsolationLevelEnum.User };

                #endregion

                #region 認証処理(UOC)

                // ★
                status = FxLiteral.SIF_STATUS_AUTHENTICATION;

                //// ★★ 認証が通っているかどうか確認する。
                //if (!HttpContext.Current.Request.IsAuthenticated)
                //{
                //    throw new BusinessSystemException("Authentication", "認証されていません。");
                //}

                // ★★ コンテキストの情報を使用するなどして
                //       認証処理をUOCする(必要に応じて)。

                //// 認証チケットの復号化
                //string[] authTicket = (string[])BinarySerialize.BytesToObject(
                //    CustomEncode.FromBase64String(
                //        SymmetricCryptography.DecryptString(
                //            context, GetConfigParameter.GetConfigValue("private-key"),
                //            EnumSymmetricAlgorithm.TripleDESCryptoServiceProvider)));

                //// ユーザIDの設定
                //muParameterValue.User.UserName = authTicket[0];

                // 認証チケットの整合性を確認
                // Forms認証では、machinekeyを使用している。
                // 必要に応じて認証サービス側も作り変える。

                //// B層・D層呼出し
                ////   タイムスタンプのチェックと、更新
                ////   スライディング・タイムアウトの実装、
                ////   必要であればアカウントの検証も実施
                //BaseReturnValue _returnValue = (BaseReturnValue)Latebind.InvokeMethod(
                //    "xxxx", "yyyy",
                //    FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME,
                //    new object[] { new AuthParameterValue("-", "-", "zzzz", "",
                //        muParameterValue.User, authTicket[1]),
                //        DbEnum.IsolationLevelEnum.User });

                //if (_returnValue.ErrorFlag)
                //{
                //    // 認証エラー
                //    throw new BusinessSystemException("xxxx", "認証チケットが不正か、タイムアウトです。");
                //}

                #endregion

                #region B層・D層呼出し

                // ★
                status = FxLiteral.SIF_STATUS_INVOKE;

                try
                {
                    // B層・D層呼出し

                    //// DLL名も指定するパターン(別DLLに含まれる)
                    //muReturnValue = (MuReturnValue)Latebind.InvokeMethod(
                    //    assemblyName, className, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet);

                    // DLL名は指定しないパターン(ExecutingAssemblyに含まれる)
                    Assembly asm = Assembly.GetExecutingAssembly();

                    // DLL名は指定しないパターンでの例外処理
                    Type t = asm.GetType(className);
                    if (t == null)
                    {
                        throw new BusinessSystemException("NoLBTypeInExecutingAssembly", string.Format("{0}クラスがExecutingAssemblyに存在しません。", className));
                    }

                    object o = Activator.CreateInstance(t);
                    muReturnValue = (MuReturnValue)Latebind.InvokeMethod(o, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet);
                }
                catch (System.Reflection.TargetInvocationException rtEx)
                {
                    // InnerExceptionを投げなおす。
                    throw rtEx.InnerException;
                }

                #endregion

                #region 戻り値の文字列化

                // ★
                status = FxLiteral.SIF_STATUS_SERIALIZE;

                if (muReturnValue.ErrorFlag)
                {
                    // エラー情報を設定する。
                    ErrorInfo errorInfo = new ErrorInfo();

                    // 業務例外
                    errorInfo.ErrorType   = FxEnum.ErrorType.BusinessApplicationException.ToString();
                    errorInfo.MessageID   = muReturnValue.ErrorMessageID;
                    errorInfo.Message     = muReturnValue.ErrorMessage;
                    errorInfo.Information = muReturnValue.ErrorInfo;

                    // ログ出力用の情報を保存
                    errorType      = FxEnum.ErrorType.BusinessApplicationException.ToString(); // 2009/09/15-この行
                    errorMessageID = muReturnValue.ErrorMessageID;
                    errorMessage   = muReturnValue.ErrorMessage;
                    errorToString  = muReturnValue.ErrorInfo;

                    // エラー情報を戻す。
                    retValue.Error = errorInfo;
                }

                #endregion

                // ★
                status = "";

                // 戻り値を設定
                if (muReturnValue.Bean != null && muReturnValue.Bean is Informations)
                {
                    // 正規の戻り値の場合
                    retValue.Info = (Informations)muReturnValue.Bean;
                }
                else
                {
                    //// 不正な戻り値の場合
                    //retValue.Info = new Informations("");
                    throw new Exception("不正な戻り値");
                }

                // 戻り値を返す。
                return(retValue);
            }
            //catch (BusinessApplicationException baEx)
            //{
            // ここには来ない↑
            //}
            catch (BusinessSystemException bsEx)
            {
                // エラー情報を設定する。
                ErrorInfo errorInfo = new ErrorInfo();

                // システム例外
                errorInfo.ErrorType   = FxEnum.ErrorType.BusinessSystemException.ToString();
                errorInfo.MessageID   = bsEx.messageID;
                errorInfo.Message     = bsEx.Message;
                errorInfo.Information = string.Empty;

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.BusinessSystemException.ToString(); // 2009/09/15-この行
                errorMessageID = bsEx.messageID;
                errorMessage   = bsEx.Message;

                errorToString = bsEx.ToString();

                // エラー情報を戻す。
                retValue.Error = errorInfo;
                return(retValue);
            }
            catch (FrameworkException fxEx)
            {
                // エラー情報を設定する。
                ErrorInfo errorInfo = new ErrorInfo();

                // フレームワーク例外
                // ★ インナーエクセプション情報は消失
                errorInfo.ErrorType   = FxEnum.ErrorType.FrameworkException.ToString();
                errorInfo.MessageID   = fxEx.messageID;
                errorInfo.Message     = fxEx.Message;
                errorInfo.Information = string.Empty;

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.FrameworkException.ToString(); // 2009/09/15-この行
                errorMessageID = fxEx.messageID;
                errorMessage   = fxEx.Message;

                errorToString = fxEx.ToString();

                // エラー情報を戻す。
                retValue.Error = errorInfo;
                return(retValue);
            }
            catch (Exception ex)
            {
                // エラー情報を設定する。
                ErrorInfo errorInfo = new ErrorInfo();

                // フレームワーク例外
                // ★ インナーエクセプション情報は消失
                errorInfo.ErrorType   = FxEnum.ErrorType.ElseException.ToString();
                errorInfo.MessageID   = "-";
                errorInfo.Message     = ex.ToString();
                errorInfo.Information = string.Empty;

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.ElseException.ToString(); // 2009/09/15-この行
                errorMessageID = "-";
                errorMessage   = ex.Message;

                // どちらを戻すべきか?
                // Muの場合は、ToStringがデフォ
                //errorToString = ex.Message;
                errorToString = ex.ToString();

                // エラー情報を戻す。
                retValue.Error = errorInfo;
                return(retValue);
                //throw; // コメントアウト
            }
            finally
            {
                // 用途によってSessionを解放するかどうかを検討。

                //// Sessionステートレス
                //Session.Clear();
                //Session.Abandon();

                // 終了ログの出力
                if (status == "")
                {
                    // 終了ログ出力
                    LogIF.InfoLog("SERVICE-IF", "正常終了");
                }
                else
                {
                    // 終了ログ出力
                    LogIF.ErrorLog("SERVICE-IF",
                                   "異常終了"
                                   + ":" + status + "\r\n"
                                   + "エラー タイプ:" + errorType + "\r\n" // 2009/09/15-この行
                                   + "エラー メッセージID:" + errorMessageID + "\r\n"
                                   + "エラー メッセージ:" + errorMessage + "\r\n"
                                   + errorToString + "\r\n");
                }
            }
        }
Example #16
0
        /// <summary>フォーム初期化共通処理</summary>
        /// <param name="eventName">イベント名(init or postback)</param>
        private void CMN_FormInit(string eventName)
        {
            // イベント追加処理を呼び出す
            this.addControlEvent();

            // カスタム認証処理 --------------------------------------------
            // -------------------------------------------------------------

            // 2009/09/01-start
            // 認証ユーザ情報をメンバにロードする --------------------------
            this.GetUserInfo();
            // -------------------------------------------------------------

            // サブシステム情報をメンバにロードする ------------------------
            this.GetSubsysInfo();
            // -------------------------------------------------------------
            // 2009/09/01-end

            // 権限チェック ------------------------------------------------
            // -------------------------------------------------------------

            // 閉塞チェック ------------------------------------------------
            // -------------------------------------------------------------

            // キャッシュ無効化処理 ----------------------------------------

            // システムで固定に出来る場合は、ここでキャッシュ無効化する。
            // Fxテスト段階では、IISの設定により制御したほうが楽。

            // また、ファイルダウンロード処理などで
            // UPでFxの設定したキャッシュ制御を
            // 変更したい場合は、Response.Clearを実行する。

            Response.AddHeader("Cache-Control", "no-cache");
            Response.CacheControl = "no-cache";

            //Response.AddHeader("Cache-Control", "private");
            //Response.CacheControl = "private";

            // -------------------------------------------------------------

            // ポストバック後の位置復元 ------------------------------------
            Page.MaintainScrollPositionOnPostBack = true;
            // -------------------------------------------------------------

            // タイトル設定 ------------------------------------------------
            // this.ContentPageFileNoExプロパティとタイトルを関係付けると良い

            this.Page.Title =
                GetConfigParameter.GetConfigValue("BrowserTitle")
                + "(" + this.ContentPageFileNoEx + ")";
            // -------------------------------------------------------------

            // ACCESSログ出力 ----------------------------------------------

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // ------------
            string strLogMessage =
                "," + UserInfo.UserName +
                "," + Request.UserHostAddress +
                "," + eventName +
                "," + this.ContentPageFileNoEx;

            // Log4Netへログ出力
            LogIF.InfoLog("ACCESS", strLogMessage);

            // -------------------------------------------------------------
        }
        /// <summary>初期化処理</summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            // 親画面の画面GUIDを設定(QueryString)から取得
            string parentScreenGuid
                = (string)Request.QueryString[FxHttpQueryStringIndex.PARENT_SCREEN_GUID];

            // MessageIDとMessageをセッションより取得し、設定
            this.lblmessage.Text   = (string)Session[parentScreenGuid + FxHttpSessionIndex.MODAL_DIALOG_MESSAGE];
            this.lblmessageID.Text = (string)Session[parentScreenGuid + FxHttpSessionIndex.MODAL_DIALOG_MESSAGEID];

            // タイトル設定
            this.Title = (string)Session[parentScreenGuid + FxHttpSessionIndex.MODAL_DIALOG_NAME];

            // アイコンを設定
            int icon = (int)Session[parentScreenGuid + FxHttpSessionIndex.MODAL_DIALOG_ICONTYPE];

            // アイコンへのパスを取得
            string iconPath;

            if (icon == (int)FxEnum.IconType.Information)
            {
                //情報を表すアイコン(i)を設定
                iconPath = GetConfigParameter.GetConfigValue(FxLiteral.INFORMATION_ICON_PATH);

                // エラー処理
                if (iconPath == "")
                {
                    throw new FrameworkException(
                              FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_PATH1[0],
                              String.Format(FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_PATH1[1],
                                            FxLiteral.INFORMATION_ICON_PATH));
                }

                this.imgIcon.ImageUrl = iconPath;
            }
            else if (icon == (int)FxEnum.IconType.Exclamation)
            {
                //警告時のアイコン(!)を設定
                iconPath = GetConfigParameter.GetConfigValue(FxLiteral.WARNING_ICON_PATH);

                // エラー処理
                if (iconPath == "")
                {
                    throw new FrameworkException(
                              FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_PATH1[0],
                              String.Format(FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_PATH1[1],
                                            FxLiteral.WARNING_ICON_PATH));
                }

                this.imgIcon.ImageUrl = iconPath;
            }
            else if (icon == (int)FxEnum.IconType.StopMark)
            {
                //エラー時のアイコン(×)を設定
                iconPath = GetConfigParameter.GetConfigValue(FxLiteral.ERROR_ICON_PATH);

                // エラー処理
                if (iconPath == "")
                {
                    throw new FrameworkException(
                              FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_PATH1[0],
                              String.Format(FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_PATH1[1],
                                            FxLiteral.ERROR_ICON_PATH));
                }

                this.imgIcon.ImageUrl = iconPath;
            }
            else
            {
            }

            // 表示の完了後、セッションを消去する。
            Session.Remove(parentScreenGuid + FxHttpSessionIndex.MODAL_DIALOG_MESSAGE);
            Session.Remove(parentScreenGuid + FxHttpSessionIndex.MODAL_DIALOG_MESSAGEID);

            Session.Remove(parentScreenGuid + FxHttpSessionIndex.MODAL_DIALOG_NAME);
            Session.Remove(parentScreenGuid + FxHttpSessionIndex.MODAL_DIALOG_ICONTYPE);

            // 認証ユーザ情報を取得する ------------------------------------
            this.GetUserInfo();
            // -------------------------------------------------------------

            // ACCESSログ出力 ----------------------------------------------

            // ------------
            // Message部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, Control名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // Error MessageID, Error Message等
            // ------------
            string strLogMessage =
                "," + this.GetUserInfo().UserName +
                "," + Request.UserHostAddress +
                ",init" +
                ",OKMessageDialog" +
                ",";

            // Log4Netへログ出力
            LogIF.InfoLog("ACCESS", strLogMessage);
        }
        /// <summary>フォーム初期化共通処理</summary>
        /// <param name="eventName">イベント名(init or postback)</param>
        private void CMN_FormInit(string eventName)
        {
            // イベント追加処理を呼び出す
            this.addControlEvent();

            // カスタム認証処理 --------------------------------------------
            // ・・・
            // -------------------------------------------------------------

            // 2009/09/01-start
            // 認証ユーザ情報をメンバにロードする --------------------------
            this.GetUserInfo();
            // -------------------------------------------------------------

            // サブシステム情報をメンバにロードする ------------------------
            this.GetSubsysInfo();
            // -------------------------------------------------------------
            // 2009/09/01-end

            // 権限チェック ------------------------------------------------
            // ・・・
            // -------------------------------------------------------------

            // 閉塞チェック ------------------------------------------------
            // ・・・
            // -------------------------------------------------------------

            // キャッシュ制御処理 ------------------------------------------
            this.CacheControlWithSwitch();
            // -------------------------------------------------------------

            // ポストバック後の位置復元 ------------------------------------
            Page.MaintainScrollPositionOnPostBack = true;
            // -------------------------------------------------------------

            // タイトル設定 ------------------------------------------------
            // this.ContentPageFileNoExプロパティとタイトルを関係付けると良い

            this.Page.Title =
                GetConfigParameter.GetConfigValue("BrowserTitle")
                + "(" + this.ContentPageFileNoEx + ")";
            // -------------------------------------------------------------

            // ACCESSログ出力 ----------------------------------------------

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // ------------
            string strLogMessage =
                "," + UserInfo.UserName +
                "," + Request.UserHostAddress +
                "," + eventName +
                "," + this.ContentPageFileNoEx;

            // Log4Netへログ出力
            LogIF.InfoLog("ACCESS", strLogMessage);

            // -------------------------------------------------------------
        }
Example #19
0
        /// <summary>SQL実行終了処理を実装する共通UOCメソッド(異常時)</summary>
        /// <param name="sql">実行したSQLの情報</param>
        /// <param name="ex">エラー情報</param>
        /// <remarks>データ アクセス親クラス1から利用される派生の末端</remarks>
        protected override void UOC_AfterQuery(string sql, Exception ex)
        {
            // 性能測定終了
            this.perfRec.EndsPerformanceRecord();

            // SQLトレースログ出力

            // ------------
            // メッセージ部
            // ------------
            // 処理時間(実行時間), 処理時間(CPU時間), ユーザ名, 実行したSQLの情報
            // ------------
            string strLogMessage
                = this.perfRec.ExecTime + ","
                  + this.perfRec.CpuTime + ","
                  + ((MyUserInfo)(this.GetDam().Obj)).UserName + ","
                  + sql;

            // Log4Netへログ出力
            string sqlTracelog = GetConfigParameter.GetConfigValue(PubLiteral.SQL_TRACELOG);

            if (sqlTracelog == null || sqlTracelog == "")
            {
                // SQLトレースログ(OFF)
            }
            else if (GetConfigParameter.GetConfigValue(PubLiteral.SQL_TRACELOG).ToUpper() == PubLiteral.ON)
            {
                LogIF.ErrorLog("SQLTRACE", strLogMessage);
            }
            else if (GetConfigParameter.GetConfigValue(PubLiteral.SQL_TRACELOG).ToUpper() == PubLiteral.OFF)
            {
                // SQLトレースログ(OFF)
            }
            else
            {
                // パラメータ・エラー(書式不正)
                throw new ArgumentException(
                          String.Format(PublicExceptionMessage.SWITCH_ERROR, PubLiteral.SQL_TRACELOG));
            }

            // ---

            // 以下も、ログ出力で使用可能
            object obj = null;

            // UOC_Connection等で情報を設定しておく。
            // UserInfoなどの情報を想定している。
            obj = this.GetDam().Obj;

            // SQL実行時に情報が自動設定される。
            // ・ExecSelectFill_DT
            //   DataTable
            // ・ExecSelectFill_DS
            //   DataSet
            // ・ExecSelect_DR
            //   IDataReader
            // ・ExecSelectScalar
            //   object
            // ・ExecInsUpDel_NonQuery
            //   int
            obj = this.LogInfo;
        }
Example #20
0
        /// <summary>ASP.NET WebAPI JSON-RPCの個別Webメソッドの共通部</summary>
        /// <param name="serviceName">サービス名</param>
        /// <param name="parameterValue">引数</param>
        /// <returns>
        /// AsyncRetVal(非同期化のため)
        /// ・WsErrorInfo:返すべきエラーの情報
        /// ・ReturnValue:戻り値
        /// </returns>
        private async Task <AsyncRetVal> Call(
            string serviceName,
            BaseParameterValue parameterValue)
        {
            // ステータス
            string status = "-";

            #region 呼出し制御関係の変数

            // アセンブリ名
            string assemblyName = "";

            // クラス名
            string className = "";

            #endregion

            #region 引数・戻り値関係の変数

            BaseReturnValue returnValue = null;

            // エラー情報(XMLフォーマット)
            Dictionary <string, string> wsErrorInfo = new Dictionary <string, string>();

            // エラー情報(ログ出力用)
            string errorType      = ""; // 2009/09/15-この行
            string errorMessageID = "";
            string errorMessage   = "";
            string errorToString  = "";

            #endregion

            try
            {
                // 開始ログの出力
                LogIF.InfoLog("SERVICE-IF", FxLiteral.SIF_STATUS_START);

                #region  前解決

                // ★
                status = FxLiteral.SIF_STATUS_NAME_SERVICE;

                // 名前解決(インプロセス)
                JsonController.IPR_NS.NameResolution(serviceName, out assemblyName, out className);

                #endregion

                #region 引数の.NETオブジェクト化(UOC)

                // ★
                status = FxLiteral.SIF_STATUS_DESERIALIZE;

                // 引数クラスをパラメタ セットに格納
                object[] paramSet = new object[] { parameterValue, DbEnum.IsolationLevelEnum.User };

                #endregion

                #region 認証処理(UOC)

                // MyBaseApiControllerに実装する。

                #endregion

                #region B層・D層呼出し

                // ★
                status = FxLiteral.SIF_STATUS_INVOKE;

                try
                {
                    // B層・D層呼出し

                    try
                    {
                        // B層・D層呼出し
                        Task <BaseReturnValue> result = (Task <BaseReturnValue>)Latebind.InvokeMethod(
                            assemblyName, className,
                            FxLiteral.TRANSMISSION_INPROCESS_ASYNC_METHOD_NAME, paramSet);
                        returnValue = await result;
                    }
                    catch (System.Reflection.TargetInvocationException rtEx)
                    {
                        //// InnerExceptionを投げなおす。
                        //throw rtEx.InnerException;

                        // スタックトレースを保って InnerException を throw
                        ExceptionDispatchInfo.Capture(rtEx.InnerException).Throw();
                    }
                }
                catch (System.Reflection.TargetInvocationException rtEx)
                {
                    // InnerExceptionを投げなおす。
                    throw rtEx.InnerException;
                }

                #endregion

                // ★
                status = "";

                // 戻り値を返す。
                return(new AsyncRetVal
                {
                    WsErrorInfo = null,
                    ReturnValue = returnValue
                });
            }
            //catch (BusinessApplicationException baEx)
            //{
            // ここには来ない↑
            //}
            catch (BusinessSystemException bsEx)
            {
                // エラー情報を設定する。
                // システム例外
                wsErrorInfo["ErrorType"] = FxEnum.ErrorType.BusinessSystemException.ToString();
                wsErrorInfo["MessageID"] = bsEx.messageID;
                wsErrorInfo["Message"]   = bsEx.Message;

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.BusinessSystemException.ToString(); // 2009/09/15-この行
                errorMessageID = bsEx.messageID;
                errorMessage   = bsEx.Message;

                errorToString = bsEx.ToString();

                // エラー情報を戻す。
                return(new AsyncRetVal
                {
                    WsErrorInfo = wsErrorInfo,
                    ReturnValue = returnValue
                });
            }
            catch (FrameworkException fxEx)
            {
                // エラー情報を設定する。
                // フレームワーク例外
                // ★ インナーエクセプション情報は消失
                wsErrorInfo["ErrorType"] = FxEnum.ErrorType.FrameworkException.ToString();
                wsErrorInfo["MessageID"] = fxEx.messageID;
                wsErrorInfo["Message"]   = fxEx.Message;

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.FrameworkException.ToString(); // 2009/09/15-この行
                errorMessageID = fxEx.messageID;
                errorMessage   = fxEx.Message;

                errorToString = fxEx.ToString();

                // エラー情報を戻す。
                return(new AsyncRetVal
                {
                    WsErrorInfo = wsErrorInfo,
                    ReturnValue = returnValue
                });
            }
            catch (Exception ex)
            {
                // エラー情報を設定する。
                // フレームワーク例外
                // ★ インナーエクセプション情報は消失
                wsErrorInfo["ErrorType"] = FxEnum.ErrorType.ElseException.ToString();
                wsErrorInfo["MessageID"] = "-";
                wsErrorInfo["Message"]   = ex.ToString();

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.ElseException.ToString(); // 2009/09/15-この行
                errorMessageID = "-";
                errorMessage   = ex.Message;

                // どちらを戻すべきか?
                // Muの場合は、Messageがデフォ
                errorToString = ex.Message;
                //errorToString = ex.ToString();

                // エラー情報を戻す。
                return(new AsyncRetVal
                {
                    WsErrorInfo = wsErrorInfo,
                    ReturnValue = returnValue
                });
            }
            finally
            {
                // 用途によってSessionを解放するかどうかを検討。

                //// Sessionステートレス
                //Session.Clear();
                //Session.Abandon();

                // 終了ログの出力
                if (status == "")
                {
                    // 終了ログ出力
                    LogIF.InfoLog("SERVICE-IF", "正常終了");
                }
                else
                {
                    // 終了ログ出力
                    LogIF.ErrorLog("SERVICE-IF",
                                   "異常終了"
                                   + ":" + status + "\r\n"
                                   + "エラー タイプ:" + errorType + "\r\n" // 2009/09/15-この行
                                   + "エラー メッセージID:" + errorMessageID + "\r\n"
                                   + "エラー メッセージ:" + errorMessage + "\r\n"
                                   + errorToString + "\r\n");
                }
            }
        }
Example #21
0
        /// <summary>一般的な例外発生時の処理を実装</summary>
        /// <param name="ex">例外オブジェクト</param>
        /// <param name="fxEventArgs">イベントハンドラの共通引数</param>
        /// <remarks>画面コード親クラス1から利用される派生の末端</remarks>
        protected override void UOC_ABEND(Exception ex, FxEventArgs fxEventArgs)
        {
            // 一般的な例外発生時の処理を実装
            // TODO:

            // 性能測定終了

            // イベント処理開始前にエラーが発生した場合は、
            // this.perfRecがnullの場合があるので、null対策コードを挿入する。
            if (this.perfRec == null)
            {
                // nullの場合、新しいインスタンスを生成し、性能測定開始。
                this.perfRec = new PerformanceRecorder();
                perfRec.StartsPerformanceRecord();
            }

            this.perfRec.EndsPerformanceRecord();

            // 認証ユーザ情報を取得する ------------------------------------
            this.GetUserInfo();

            // ACCESSログ出力-----------------------------------------------

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // ------------
            string strLogMessage =
                "," + UserInfo.UserName +
                "," + Request.UserHostAddress +
                "," + "<-----" +
                "," + this.ContentPageFileNoEx +
                "," + fxEventArgs.ButtonID +
                "," + "" +
                "," + this.perfRec.ExecTime +
                "," + this.perfRec.CpuTime +
                "," + "other Exception" +
                "," + ex.Message + "\r\n";

            // OriginalStackTrace(ログ出力)の品質向上
            if (this.OriginalStackTrace == "")
            {
                strLogMessage += ex.StackTrace;
            }
            else
            {
                strLogMessage += this.OriginalStackTrace;
            }

            // Log4Netへログ出力
            LogIF.ErrorLog("ACCESS", strLogMessage);

            // -------------------------------------------------------------

            // エラー画面に画面遷移する ------------------------------------
            this.TransferErrorScreen(ex);
            // -------------------------------------------------------------
        }
Example #22
0
        /// <summary>
        /// アクション メソッドの呼び出し前に発生します(netcore)。
        /// https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.aspnetcore.mvc.filters.actionfilterattribute.onactionexecutionasync
        /// </summary>
        /// <param name="context">HttpActionContext</param>
        /// <param name="next">ActionExecutionDelegate</param>
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            #region OnActionExecutingAsyncから移行

            // Controller・Action名を取得する。
            this.GetControllerAndActionName(context);

            // Claimを取得する。
            string userName, roles, scopes, ipAddress;
            MyBaseAsyncApiController.GetClaims(out userName, out roles, out scopes, out ipAddress);

            // 権限チェック ------------------------------------------------
            // ・・・
            // -------------------------------------------------------------

            // 閉塞チェック ------------------------------------------------
            // ・・・
            // -------------------------------------------------------------

            // 性能測定開始
            this.perfRec = new PerformanceRecorder();
            this.perfRec.StartsPerformanceRecord();

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // ------------

            string strLogMessage =
                "," + userName +  //this.UserInfo.UserName +
                "," + ipAddress + //this.UserInfo.IPAddress +
                "," + "----->" +
                "," + this.ControllerName +
                "," + this.ActionName + "(OnActionExecuting)";

            LogIF.InfoLog("ACCESS", strLogMessage);

            // 性能測定終了
            this.perfRec.EndsPerformanceRecord();

            #endregion

            await base.OnActionExecutionAsync(context, next);

            #region OnActionExecutedAsyncから移行

            // ------------
            // メッセージ部
            // ------------
            // ユーザ名, IPアドレス,
            // レイヤ, 画面名, コントロール名, 処理名
            // 処理時間(実行時間), 処理時間(CPU時間)
            // エラーメッセージID, エラーメッセージ等
            // -----------

            strLogMessage =
                "," + userName +  //this.UserInfo.UserName +
                "," + ipAddress + //this.UserInfo.IPAddress +
                "," + "<-----" +
                "," + this.ControllerName +
                "," + this.ActionName + "(OnActionExecuted)" +
                "," + perfRec.ExecTime +
                "," + perfRec.CpuTime;

            LogIF.InfoLog("ACCESS", strLogMessage);

            #endregion
        }
Example #23
0
        /// <summary>Soap & Bean の個別Webメソッドの共通部</summary>
        /// <param name="context">コンテキスト</param>
        /// <param name="methodName">メソッド名</param>
        /// <param name="parameterValue">引数Bean(個別・・・サブ)</param>
        /// <param name="returnValue">戻り値Bean(個別・・・サブ)</param>
        /// <returns>返すべきエラーの情報</returns>
        private string Call(ref string context, string serviceName, string methodName, string actionType, object parameterValue, out object returnValue)
        {
            // ステータス
            string status = "-";

            // 初期化のため
            returnValue = "";

            #region 呼出し制御関係の変数

            // アセンブリ名
            string assemblyName = "";

            // クラス名
            string className = "";

            #endregion

            #region 引数・戻り値関係の変数

            // 引数・戻り値の.NETオブジェクト
            MuParameterValue muParameterValue = null;
            MuReturnValue    muReturnValue    = null;

            // エラー情報(XMLフォーマット)
            XmlDocument wsErrorInfo = new XmlDocument();
            XmlElement  wsErrorRoot = null;
            XmlElement  wsErrorItem = null;

            // エラー情報(ログ出力用)
            string errorType      = ""; // 2009/09/15-この行
            string errorMessageID = "";
            string errorMessage   = "";
            string errorToString  = "";

            #endregion

            try
            {
                // 開始ログの出力
                LogIF.InfoLog("SERVICE-IF", FxLiteral.SIF_STATUS_START);

                #region  前解決

                // ★
                status = FxLiteral.SIF_STATUS_NAME_SERVICE;

                // 名前解決(インプロセス)
                ServiceForSb.IPR_NS.NameResolution(serviceName, out assemblyName, out className);

                #endregion

                #region 引数の.NETオブジェクト化(UOC)

                // ★
                status = FxLiteral.SIF_STATUS_DESERIALIZE;

                // ★★ 引数の.NETオブジェクト化をUOCする(必要に応じて)。

                // 引数文字列の.NETオブジェクト化

                // string[] cmnParameterValueを使用して初期化するなど
                muParameterValue = new MuParameterValue(
                    "",         //cmnParameterValue[0], // 画面名
                    "",         //cmnParameterValue[1], // ボタン名
                    methodName, //cmnParameterValue[2], // メソッド名
                    actionType, //cmnParameterValue[3], // アクションタイプ
                    new MyUserInfo(context, HttpContext.Current.Request.UserHostAddress));

                // parameterValueを引数の文字列フィールドに設定
                muParameterValue.Bean = parameterValue;

                // 引数クラスをパラメタ セットに格納
                object[] paramSet = new object[] { muParameterValue, DbEnum.IsolationLevelEnum.User };

                #endregion

                #region 認証処理(UOC)

                // ★
                status = FxLiteral.SIF_STATUS_AUTHENTICATION;

                // ★★ 認証が通っているかどうか確認する。
                if (!HttpContext.Current.Request.IsAuthenticated)
                {
                    throw new BusinessSystemException("Authentication", "認証されていません。");
                }

                // ★★ コンテキストの情報を使用するなどして
                //       認証処理をUOCする(必要に応じて)。

                //// 認証チケットの復号化
                //string[] authTicket = (string[])BinarySerialize.BytesToObject(
                //    CustomEncode.FromBase64String(
                //        SymmetricCryptography.DecryptString(
                //            context, GetConfigParameter.GetConfigValue("private-key"),
                //            EnumSymmetricAlgorithm.TripleDESCryptoServiceProvider)));

                //// ユーザIDの設定
                //muParameterValue.User.UserName = authTicket[0];

                // 認証チケットの整合性を確認
                // Forms認証では、machinekeyを使用している。
                // 必要に応じて認証サービス側も作り変える。

                //// B層・D層呼出し
                ////   タイムスタンプのチェックと、更新
                ////   スライディング・タイムアウトの実装、
                ////   必要であればアカウントの検証も実施
                //BaseReturnValue _returnValue = (BaseReturnValue)Latebind.InvokeMethod(
                //    "xxxx", "yyyy",
                //    FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME,
                //    new object[] { new AuthParameterValue("-", "-", "zzzz", "",
                //        muParameterValue.User, authTicket[1]),
                //        DbEnum.IsolationLevelEnum.User });

                //if (_returnValue.ErrorFlag)
                //{
                //    // 認証エラー
                //    throw new BusinessSystemException("xxxx", "認証チケットが不正か、タイムアウトです。");
                //}

                // 持ち回るならCookieにするか、
                // contextをrefにするなどとする。
                context = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff"); // 更新されたかのテストコード

                #endregion

                #region B層・D層呼出し

                // ★
                status = FxLiteral.SIF_STATUS_INVOKE;

                try
                {
                    // B層・D層呼出し

                    //// DLL名も指定するパターン(別DLLに含まれる)
                    //muReturnValue = (MuReturnValue)Latebind.InvokeMethod(
                    //    assemblyName, className, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet);

                    // DLL名は指定しないパターン(ExecutingAssemblyに含まれる)
                    Assembly asm = Assembly.GetExecutingAssembly();

                    // DLL名は指定しないパターンでの例外処理
                    Type t = asm.GetType(className);
                    if (t == null)
                    {
                        throw new BusinessSystemException("NoLBTypeInExecutingAssembly", string.Format("{0}クラスがExecutingAssemblyに存在しません。", className));
                    }

                    object o = Activator.CreateInstance(t);
                    muReturnValue = (MuReturnValue)Latebind.InvokeMethod(o, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet);
                }
                catch (System.Reflection.TargetInvocationException rtEx)
                {
                    // InnerExceptionを投げなおす。
                    throw rtEx.InnerException;
                }

                #endregion

                #region 戻り値

                // ★
                status = FxLiteral.SIF_STATUS_SERIALIZE;

                returnValue = muReturnValue.Bean;

                if (muReturnValue.ErrorFlag)
                {
                    // エラー情報を設定する。
                    wsErrorRoot = wsErrorInfo.CreateElement("ErrorInfo");
                    wsErrorInfo.AppendChild(wsErrorRoot);

                    // 業務例外
                    wsErrorItem           = wsErrorInfo.CreateElement("ErrorType");
                    wsErrorItem.InnerText = FxEnum.ErrorType.BusinessApplicationException.ToString();
                    wsErrorRoot.AppendChild(wsErrorItem);

                    wsErrorItem           = wsErrorInfo.CreateElement("MessageID");
                    wsErrorItem.InnerText = muReturnValue.ErrorMessageID;
                    wsErrorRoot.AppendChild(wsErrorItem);

                    wsErrorItem           = wsErrorInfo.CreateElement("Message");
                    wsErrorItem.InnerText = muReturnValue.ErrorMessage;
                    wsErrorRoot.AppendChild(wsErrorItem);

                    wsErrorItem           = wsErrorInfo.CreateElement("Information");
                    wsErrorItem.InnerText = muReturnValue.ErrorInfo;
                    wsErrorRoot.AppendChild(wsErrorItem);

                    // ログ出力用の情報を保存
                    errorType      = FxEnum.ErrorType.BusinessApplicationException.ToString(); // 2009/09/15-この行
                    errorMessageID = muReturnValue.ErrorMessageID;
                    errorMessage   = muReturnValue.ErrorMessage;
                    errorToString  = muReturnValue.ErrorInfo;

                    // エラー情報を戻す。
                    return(wsErrorInfo.InnerXml);
                }

                #endregion

                // ★
                status = "";

                // 戻り値を返す。
                return("");
            }
            //catch (BusinessApplicationException baEx)
            //{
            // ここには来ない↑
            //}
            catch (BusinessSystemException bsEx)
            {
                // エラー情報を設定する。
                wsErrorRoot = wsErrorInfo.CreateElement("ErrorInfo");
                wsErrorInfo.AppendChild(wsErrorRoot);

                // システム例外
                wsErrorItem           = wsErrorInfo.CreateElement("ErrorType");
                wsErrorItem.InnerText = FxEnum.ErrorType.BusinessSystemException.ToString();
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("MessageID");
                wsErrorItem.InnerText = bsEx.messageID;
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("Message");
                wsErrorItem.InnerText = bsEx.Message;
                wsErrorRoot.AppendChild(wsErrorItem);

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.BusinessSystemException.ToString(); // 2009/09/15-この行
                errorMessageID = bsEx.messageID;
                errorMessage   = bsEx.Message;

                errorToString = bsEx.ToString();

                // エラー情報を戻す。
                return(wsErrorInfo.InnerXml);
            }
            catch (FrameworkException fxEx)
            {
                // エラー情報を設定する。
                wsErrorRoot = wsErrorInfo.CreateElement("ErrorInfo");
                wsErrorInfo.AppendChild(wsErrorRoot);

                // フレームワーク例外
                // ★ インナーエクセプション情報は消失
                wsErrorItem           = wsErrorInfo.CreateElement("ErrorType");
                wsErrorItem.InnerText = FxEnum.ErrorType.FrameworkException.ToString();
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("MessageID");
                wsErrorItem.InnerText = fxEx.messageID;
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("Message");
                wsErrorItem.InnerText = fxEx.Message;
                wsErrorRoot.AppendChild(wsErrorItem);

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.FrameworkException.ToString(); // 2009/09/15-この行
                errorMessageID = fxEx.messageID;
                errorMessage   = fxEx.Message;

                errorToString = fxEx.ToString();

                // エラー情報を戻す。
                return(wsErrorInfo.InnerXml);
            }
            catch (Exception ex)
            {
                // エラー情報を設定する。
                wsErrorRoot = wsErrorInfo.CreateElement("ErrorInfo");
                wsErrorInfo.AppendChild(wsErrorRoot);

                // フレームワーク例外
                // ★ インナーエクセプション情報は消失
                wsErrorItem           = wsErrorInfo.CreateElement("ErrorType");
                wsErrorItem.InnerText = FxEnum.ErrorType.ElseException.ToString();
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("MessageID");
                wsErrorItem.InnerText = "-";
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("Message");
                wsErrorItem.InnerText = ex.ToString();
                wsErrorRoot.AppendChild(wsErrorItem);

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.ElseException.ToString(); // 2009/09/15-この行
                errorMessageID = "-";
                errorMessage   = ex.Message;

                // どちらを戻すべきか?
                // Muの場合は、Messageがデフォ
                errorToString = ex.Message;
                //errorToString = ex.ToString();

                // エラー情報を戻す。
                return(wsErrorInfo.InnerXml);
                //throw; // コメントアウト
            }
            finally
            {
                // 用途によってSessionを解放するかどうかを検討。

                //// Sessionステートレス
                //Session.Clear();
                //Session.Abandon();

                // 終了ログの出力
                if (status == "")
                {
                    // 終了ログ出力
                    LogIF.InfoLog("SERVICE-IF", "正常終了");
                }
                else
                {
                    // 終了ログ出力
                    LogIF.ErrorLog("SERVICE-IF",
                                   "異常終了"
                                   + ":" + status + "\r\n"
                                   + "エラー タイプ:" + errorType + "\r\n" // 2009/09/15-この行
                                   + "エラー メッセージID:" + errorMessageID + "\r\n"
                                   + "エラー メッセージ:" + errorMessage + "\r\n"
                                   + errorToString + "\r\n");
                }
            }
        }
Example #24
0
        /// <summary>
        ///  Maintains the Main thread of the Asynchronous Service
        /// </summary>
        public void MainThreadInvoke()
        {
            // Asynchronous service is started
            LogIF.InfoLog("ASYNC-SERVICE", GetMessage.GetMessageDescription("I0001"));

            // Infinte loop processing for selecting register task.
            while (this._infiniteLoop)
            {
                try
                {
                    // Get asynchronous task from the database.
                    AsyncProcessingServiceParameterValue asyncParameterValue = new AsyncProcessingServiceParameterValue("AsyncProcessingService", "SelectTask", "SelectTask", "SQL",
                                                                                                                        new MyUserInfo("AsyncProcessingService", "AsyncProcessingService"));
                    asyncParameterValue.RegistrationDateTime = DateTime.Now - new TimeSpan(_maxNumberOfHours, 0, 0);
                    asyncParameterValue.NumberOfRetries      = this._maxNumberOfRetries;
                    asyncParameterValue.CompletionDateTime   = DateTime.Now - new TimeSpan(_maxNumberOfHours, 0, 0);
                    LayerB layerB = new LayerB();
                    AsyncProcessingServiceReturnValue selectedAsyncTask = (AsyncProcessingServiceReturnValue)layerB.DoBusinessLogic(
                        (BaseParameterValue)asyncParameterValue, DbEnum.IsolationLevelEnum.ReadCommitted);

                    // Existence check of asynchronous task
                    if (string.IsNullOrEmpty(selectedAsyncTask.UserId))
                    {
                        // Asynchronous task does not exist.

                        // Wait for the asynchronous task to be registered in the database.
                        Thread.Sleep(this._numberOfSeconds * 1000);

                        // Continue to this infinite loop.
                        continue;
                    }
                    // Asynchronous task exists.

                    // Check the number of free worker threads.
                    int freeWorkerThreads     = 0;
                    int completionPortThreads = 0;

                    // Gets the available threads.
                    ThreadPool.GetAvailableThreads(out freeWorkerThreads, out completionPortThreads);

                    while (freeWorkerThreads == 0)
                    {
                        // Wait for the completion of the worker thread.
                        Thread.Sleep(this._numberOfSeconds * 1000);

                        // Get available threads.
                        ThreadPool.GetAvailableThreads(out freeWorkerThreads, out completionPortThreads);
                    }

                    // Selected asynchronous task is assigned to a worker thread
                    this.UpdateAsyncTask(selectedAsyncTask, AsyncTaskUpdate.START);
                    LogIF.InfoLog("ASYNC-SERVICE", string.Format(GetMessage.GetMessageDescription("I0002"), selectedAsyncTask.TaskId));

                    // Assign the task to the worker thread
                    ThreadPool.QueueUserWorkItem(new WaitCallback(this.WorkerThreadCallBack), (object)selectedAsyncTask);
                }
                catch (Exception ex)
                {
                    // Service Failed due to unexpected exception.
                    this._infiniteLoop = false;
                    LogIF.ErrorLog("ASYNC-SERVICE", string.Format(GetMessage.GetMessageDescription("E0000"), ex.Message.ToString()));
                }
            }
        }
Example #25
0
 /// <summary>
 /// Shutdown this service with main thread and worker thread..
 /// </summary>
 protected override void OnShutdown()
 {
     // Stop the process of asynchronous service and Waits to complete all worker thread to complete.
     LogIF.InfoLog("ASYNC-SERVICE", GetMessage.GetMessageDescription("I0007"));
     this.StopAsyncProcess();
 }
Example #26
0
        /// <summary>
        /// ASP.NET Webサービスを使用した
        /// サービス インターフェイス基盤(.NETオンライン)
        /// </summary>
        /// <param name="serviceName">サービス名</param>
        /// <param name="contextObject">コンテキスト</param>
        /// <param name="parameterValueObject">引数</param>
        /// <param name="returnValueObject">戻り値</param>
        /// <returns>返すべきエラーの情報</returns>
        /// <remarks>値は全て.NETオブジェクトをバイナリシリアライズしたバイト配列データ</remarks>
        public byte[] DotNETOnlineWS(
            string serviceName, ref byte[] contextObject,
            byte[] parameterValueObject, out byte[] returnValueObject)
        {
            // ステータス
            string status = "-";

            // 初期化のため
            returnValueObject = null;

            #region 呼出し制御関係の変数

            // アセンブリ名
            string assemblyName = "";

            // クラス名
            string className = "";

            #endregion

            #region 引数・戻り値関係の変数

            // コンテキスト情報
            object context; // 2009/09/29-この行

            // 引数・戻り値の.NETオブジェクト
            BaseParameterValue parameterValue;
            BaseReturnValue    returnValue;

            // エラー情報(クライアント側で復元するため)
            WSErrorInfo wsErrorInfo = new WSErrorInfo();

            // エラー情報(ログ出力用)
            string errorType      = ""; // 2009/09/15-この行
            string errorMessageID = "";
            string errorMessage   = "";
            string errorToString  = "";

            #endregion

            try
            {
                // 開始ログの出力
                LogIF.InfoLog("SERVICE-IF", FxLiteral.SIF_STATUS_START);

                #region  前解決

                // ★
                status = FxLiteral.SIF_STATUS_NAME_SERVICE;

                // 名前解決(インプロセス)
                WCFHTTPSvcForFx.IPR_NS.NameResolution(serviceName, out assemblyName, out className);

                #endregion

                #region 引数のデシリアライズ

                // ★
                status = FxLiteral.SIF_STATUS_DESERIALIZE;

                // コンテキストクラスの.NETオブジェクト化
                context = BinarySerialize.BytesToObject(contextObject); // 2009/09/29-この行
                // ※ コンテキストの利用方法は任意だが、サービスインターフェイス上での利用に止める。

                // 引数クラスの.NETオブジェクト化
                parameterValue = (BaseParameterValue)BinarySerialize.BytesToObject(parameterValueObject);

                // 引数クラスをパラメタ セットに格納
                object[] paramSet = new object[] { parameterValue, DbEnum.IsolationLevelEnum.User };

                #endregion

                #region 認証処理のUOC

                // ★
                status = FxLiteral.SIF_STATUS_AUTHENTICATION;

                // ★★ コンテキストの情報を使用するなどして
                //       認証処理をUOCする(必要に応じて)。

                //// 認証チケットの復号化
                //string[] authTicket = (string[])BinarySerialize.BytesToObject(
                //    CustomEncode.FromBase64String(
                //        SymmetricCryptography.DecryptString(
                //            (string)context, GetConfigParameter.GetConfigValue("private-key"),
                //            EnumSymmetricAlgorithm.TripleDESCryptoServiceProvider)));

                //// 認証チケットの整合性を確認

                //// B層・D層呼出し
                ////   スライディング・タイムアウトの実装、
                ////   タイムスタンプのチェックと、更新
                //returnValue = (BaseReturnValue)Latebind.InvokeMethod(
                //    "xxxx", "yyyy",
                //    FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME,
                //    new object[] { new AuthParameterValue("-", "-", "zzzz", "",
                //        ((MyParameterValue)parameterValue).User, authTicket[1]),
                //        DbEnum.IsolationLevelEnum.User });

                //if (returnValue.ErrorFlag)
                //{
                //    // 認証エラー
                //    throw new BusinessSystemException("xxxx", "認証チケットが不正か、タイムアウトです。");
                //}

                // 持ち回るならCookieにするか、
                // contextをrefにするなどとする。
                contextObject = BinarySerialize.ObjectToBytes(DateTime.Now); // 更新されたかのテストコード

                #endregion

                #region B層・D層呼出し

                // ★
                status = FxLiteral.SIF_STATUS_INVOKE;

                // #17-start
                try
                {
                    // B層・D層呼出し
                    //returnValue = (BaseReturnValue)Latebind.InvokeMethod(
                    //    AppDomain.CurrentDomain.BaseDirectory + "\\bin\\" + assemblyName + ".dll",
                    //    className, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet);
                    returnValue = (BaseReturnValue)Latebind.InvokeMethod(
                        assemblyName, className,
                        FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet);
                }
                catch (System.Reflection.TargetInvocationException rtEx)
                {
                    // InnerExceptionを投げなおす。
                    throw rtEx.InnerException;
                }
                // #17-end

                #endregion

                #region 戻り値のシリアライズ

                // ★
                status = FxLiteral.SIF_STATUS_SERIALIZE;

                returnValueObject = BinarySerialize.ObjectToBytes(returnValue);

                #endregion

                // ★
                status = "";

                // 戻り値を返す。
                return(null);
            }
            catch (BusinessSystemException bsEx)
            {
                // システム例外

                // エラー情報を設定する。
                wsErrorInfo.ErrorType      = FxEnum.ErrorType.BusinessSystemException;
                wsErrorInfo.ErrorMessageID = bsEx.messageID;
                wsErrorInfo.ErrorMessage   = bsEx.Message;

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.BusinessSystemException.ToString(); // 2009/09/15-この行
                errorMessageID = bsEx.messageID;
                errorMessage   = bsEx.Message;

                errorToString = bsEx.ToString();

                // エラー情報を戻す。
                return(BinarySerialize.ObjectToBytes(wsErrorInfo));
            }
            catch (FrameworkException fxEx)
            {
                // フレームワーク例外
                // ★ インナーエクセプション情報は消失

                // エラー情報を設定する。
                wsErrorInfo.ErrorType      = FxEnum.ErrorType.FrameworkException;
                wsErrorInfo.ErrorMessageID = fxEx.messageID;
                wsErrorInfo.ErrorMessage   = fxEx.Message;

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.FrameworkException.ToString(); // 2009/09/15-この行
                errorMessageID = fxEx.messageID;
                errorMessage   = fxEx.Message;

                errorToString = fxEx.ToString();

                // エラー情報を戻す。
                return(BinarySerialize.ObjectToBytes(wsErrorInfo));
            }
            catch (Exception ex)
            {
                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.ElseException.ToString(); // 2009/09/15-この行
                errorMessageID = "-";
                errorMessage   = ex.Message;

                errorToString = ex.ToString();

                throw; // SoapExceptionになって伝播
            }
            finally
            {
                // Sessionステートレス
                //HttpContext.Current.Session.Clear();
                //HttpContext.Current.Session.Abandon();

                // 終了ロクの出力
                if (status == "")
                {
                    // 終了ログ出力
                    LogIF.InfoLog("SERVICE-IF", "正常終了");
                }
                else
                {
                    // 終了ログ出力
                    LogIF.ErrorLog("SERVICE-IF",
                                   "異常終了"
                                   + ":" + status + "\r\n"
                                   + "エラー タイプ:" + errorType + "\r\n" // 2009/09/15-この行
                                   + "エラー メッセージID:" + errorMessageID + "\r\n"
                                   + "エラー メッセージ:" + errorMessage + "\r\n"
                                   + errorToString + "\r\n");
                }
            }
        }
Example #27
0
        /// <summary>
        ///  Maintains the single worker thread functionalities.
        /// </summary>
        /// <param name="asyncTask">Selected Asynchronous Task</param>
        private void WorkerThreadCallBack(object asyncTask)
        {
            AsyncProcessingServiceReturnValue selectedAsyncTask = (AsyncProcessingServiceReturnValue)asyncTask;

            // A new worker thread started an Async task
            this._workerThreadCount++;

            try
            {
                // To handle unstable "Register" state, when you invoke [Abort] at this state
                if (selectedAsyncTask.CommandId == (int)AsyncProcessingServiceParameterValue.AsyncCommand.Abort)
                {
                    throw new BusinessSystemException("APSAbortCommand", GetMessage.GetMessageDescription("CTE0004"));
                }

                // Call User Program to execute by using communication control function
                AsyncProcessingServiceParameterValue asyncParameterValue = new AsyncProcessingServiceParameterValue("AsyncProcessingService", "Start", "Start", "SQL",
                                                                                                                    new MyUserInfo(selectedAsyncTask.UserId, selectedAsyncTask.TaskId.ToString()));
                asyncParameterValue.TaskId = selectedAsyncTask.TaskId;
                asyncParameterValue.Data   = selectedAsyncTask.Data;
                CallController callController = new CallController(asyncParameterValue.User);
                AsyncProcessingServiceReturnValue asyncReturnValue = (AsyncProcessingServiceReturnValue)callController.Invoke(selectedAsyncTask.ProcessName, asyncParameterValue);

                if (asyncReturnValue.ErrorFlag == true)
                {
                    if (asyncReturnValue.ErrorMessageID == "APSStopCommand")
                    {
                        string exceptionInfo = "ErrorMessageID: " + asyncReturnValue.ErrorMessageID + Environment.NewLine + "ErrorMessage: " + asyncReturnValue.ErrorMessage;
                        // Asynchronous task is stopped due to user 'stop' command.
                        this.UpdateAsyncTask(selectedAsyncTask, AsyncTaskUpdate.RETRY, exceptionInfo);
                        LogIF.ErrorLog("ASYNC-SERVICE", string.Format(GetMessage.GetMessageDescription("E0001") + asyncReturnValue.ErrorMessage, selectedAsyncTask.TaskId));
                    }
                    else
                    {
                        // Exception occurred by other than BusinessApplicationException

                        if (selectedAsyncTask.NumberOfRetries < this._maxNumberOfRetries)
                        {
                            // Asynchronous task does not exceeds the maximum number of retries
                            // Updated as retry later
                            string exceptionInfo = "ErrorMessageID: " + asyncReturnValue.ErrorMessageID + Environment.NewLine + "ErrorMessage: " + asyncReturnValue.ErrorMessage;
                            selectedAsyncTask.NumberOfRetries += 1;
                            this.UpdateAsyncTask(selectedAsyncTask, AsyncTaskUpdate.RETRY, exceptionInfo);
                            LogIF.ErrorLog("ASYNC-SERVICE", string.Format(GetMessage.GetMessageDescription("E0004"), selectedAsyncTask.TaskId));
                        }
                        else
                        {
                            // Asynchronous task exceeds maximum number of retries
                            // Update task as abort
                            string exceptionInfo = "ErrorMessageID: " + asyncReturnValue.ErrorMessageID + Environment.NewLine + "ErrorMessage: " + asyncReturnValue.ErrorMessage;
                            this.UpdateAsyncTask(selectedAsyncTask, AsyncTaskUpdate.FAIL, exceptionInfo);
                            LogIF.ErrorLog("ASYNC-SERVICE", string.Format(GetMessage.GetMessageDescription("E0005"), selectedAsyncTask.TaskId));
                        }
                    }
                }
                else
                {
                    // Selected Asynchronous task is completed successfully.
                    this.UpdateAsyncTask(selectedAsyncTask, AsyncTaskUpdate.SUCCESS);
                    LogIF.InfoLog("ASYNC-SERVICE", string.Format(GetMessage.GetMessageDescription("I0003"), selectedAsyncTask.TaskId));
                }
            }
            catch (BusinessSystemException ex)
            {
                // Asynchronous task is aborted due to BusinessSystemException sent by user program.
                string exceptionInfo = "ErrorMessageID: " + ex.messageID + Environment.NewLine + "ErrorMessage: " + ex.Message;
                this.UpdateAsyncTask(selectedAsyncTask, AsyncTaskUpdate.FAIL, exceptionInfo);
                LogIF.ErrorLog("ASYNC-SERVICE", string.Format(GetMessage.GetMessageDescription("E0006"), selectedAsyncTask.TaskId, ex.Message));
            }
            catch (Exception ex)
            {
                // Asynchronous task is aborted due to unexpected exception.
                string exceptionInfo = "ErrorMessageID: " + ex.GetType().Name + Environment.NewLine + "ErrorMessage: " + ex.Message;
                this.UpdateAsyncTask(selectedAsyncTask, AsyncTaskUpdate.FAIL, exceptionInfo);
                LogIF.ErrorLog("ASYNC-SERVICE", string.Format(GetMessage.GetMessageDescription("E0006"), selectedAsyncTask.TaskId, ex.Message));
            }
            finally
            {
                // Async task is over
                this._workerThreadCount--;
            }
        }
        /// <summary>
        /// WCFの.NETオブジェクトのバイナリ転送用Soap Webメソッド
        /// </summary>
        /// <param name="serviceName">サービス名</param>
        /// <param name="contextObject">コンテキスト</param>
        /// <param name="parameterValueObject">引数</param>
        /// <param name="returnValueObject">戻り値</param>
        /// <returns>返すべきエラーの情報</returns>
        /// <remarks>値は全て.NETオブジェクトをバイナリシリアライズしたバイト配列データ</remarks>
        public byte[] DotNETOnlineWS(
            string serviceName, ref byte[] contextObject,
            byte[] parameterValueObject, out byte[] returnValueObject)
        {
            // ステータス
            string status = "-";

            // 初期化のため
            returnValueObject = null;

            #region 呼出し制御関係の変数

            // アセンブリ名
            string assemblyName = "";

            // クラス名
            string className = "";

            #endregion

            #region 引数・戻り値関係の変数

            // コンテキスト情報
            object context; // 2009/09/29-この行

            // 引数・戻り値の.NETオブジェクト
            BaseParameterValue parameterValue = null;
            BaseReturnValue    returnValue    = null;

            // エラー情報(クライアント側で復元するため)
            WSErrorInfo wsErrorInfo = new WSErrorInfo();

            // エラー情報(ログ出力用)
            string errorType      = ""; // 2009/09/15-この行
            string errorMessageID = "";
            string errorMessage   = "";
            string errorToString  = "";

            #endregion

            try
            {
                // 開始ログの出力
                LogIF.InfoLog("SERVICE-IF", FxLiteral.SIF_STATUS_START);

                #region  前解決

                // ★
                status = FxLiteral.SIF_STATUS_NAME_SERVICE;

                // 名前解決(インプロセス)
                WCFHTTPSvcForFx.IPR_NS.NameResolution(serviceName, out assemblyName, out className);

                #endregion

                #region 引数のデシリアライズ

                // ★
                status = FxLiteral.SIF_STATUS_DESERIALIZE;

                // コンテキストクラスの.NETオブジェクト化
                context = BinarySerialize.BytesToObject(contextObject); // 2009/09/29-この行
                // ※ コンテキストの利用方法は任意だが、サービスインターフェイス上での利用に止める。

                // 引数クラスの.NETオブジェクト化
                parameterValue = (BaseParameterValue)BinarySerialize.BytesToObject(parameterValueObject);

                // 引数クラスをパラメタ セットに格納
                object[] paramSet = new object[] { parameterValue, DbEnum.IsolationLevelEnum.User };

                #endregion

                #region 認証処理のUOC

                // ★
                status = FxLiteral.SIF_STATUS_AUTHENTICATION;

                string access_token = (string)context;
                if (!string.IsNullOrEmpty(access_token))
                {
                    string        sub    = "";
                    List <string> roles  = null;
                    List <string> scopes = null;
                    JObject       jobj   = null;

                    if (JwtToken.Verify(access_token, out sub, out roles, out scopes, out jobj))
                    {
                        // 認証成功
                        Debug.WriteLine("認証成功");
                    }
                    else
                    {
                        // 認証失敗(認証必須ならエラーにする。
                    }
                }
                else
                {
                    // 認証失敗(認証必須ならエラーにする。
                }

                //contextObject = BinarySerialize.ObjectToBytes(hogehoge); // 更新可能だが...。

                #endregion

                #region B層・D層呼出し

                // ★
                status = FxLiteral.SIF_STATUS_INVOKE;

                // #17-start
                try
                {
                    // B層・D層呼出し
                    //returnValue = (BaseReturnValue)Latebind.InvokeMethod(
                    //    AppDomain.CurrentDomain.BaseDirectory + "\\bin\\" + assemblyName + ".dll",
                    //    className, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet);
                    returnValue = (BaseReturnValue)Latebind.InvokeMethod(
                        assemblyName, className,
                        FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet);
                }
                catch (System.Reflection.TargetInvocationException rtEx)
                {
                    //// InnerExceptionを投げなおす。
                    //throw rtEx.InnerException;

                    // スタックトレースを保って InnerException を throw
                    ExceptionDispatchInfo.Capture(rtEx.InnerException).Throw();
                }
                // #17-end

                #endregion

                #region 戻り値のシリアライズ

                // ★
                status = FxLiteral.SIF_STATUS_SERIALIZE;

                returnValueObject = BinarySerialize.ObjectToBytes(returnValue);

                #endregion

                // ★
                status = "";

                // 戻り値を返す。
                return(null);
            }
            catch (BusinessSystemException bsEx)
            {
                // システム例外

                // エラー情報を設定する。
                wsErrorInfo.ErrorType      = FxEnum.ErrorType.BusinessSystemException;
                wsErrorInfo.ErrorMessageID = bsEx.messageID;
                wsErrorInfo.ErrorMessage   = bsEx.Message;

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.BusinessSystemException.ToString(); // 2009/09/15-この行
                errorMessageID = bsEx.messageID;
                errorMessage   = bsEx.Message;

                errorToString = bsEx.ToString();

                // エラー情報を戻す。
                return(BinarySerialize.ObjectToBytes(wsErrorInfo));
            }
            catch (FrameworkException fxEx)
            {
                // フレームワーク例外
                // ★ インナーエクセプション情報は消失

                // エラー情報を設定する。
                wsErrorInfo.ErrorType      = FxEnum.ErrorType.FrameworkException;
                wsErrorInfo.ErrorMessageID = fxEx.messageID;
                wsErrorInfo.ErrorMessage   = fxEx.Message;

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.FrameworkException.ToString(); // 2009/09/15-この行
                errorMessageID = fxEx.messageID;
                errorMessage   = fxEx.Message;

                errorToString = fxEx.ToString();

                // エラー情報を戻す。
                return(BinarySerialize.ObjectToBytes(wsErrorInfo));
            }
            catch (Exception ex)
            {
                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.ElseException.ToString(); // 2009/09/15-この行
                errorMessageID = "-";
                errorMessage   = ex.Message;

                errorToString = ex.ToString();

                throw; // SoapExceptionになって伝播
            }
            finally
            {
                // Sessionステートレス
                //HttpContext.Current.Session.Clear();
                //HttpContext.Current.Session.Abandon();

                // 終了ロクの出力
                if (status == "")
                {
                    // 終了ログ出力
                    LogIF.InfoLog("SERVICE-IF", "正常終了");
                }
                else
                {
                    // 終了ログ出力
                    LogIF.ErrorLog("SERVICE-IF",
                                   "異常終了"
                                   + ":" + status + "\r\n"
                                   + "エラー タイプ:" + errorType + "\r\n" // 2009/09/15-この行
                                   + "エラー メッセージID:" + errorMessageID + "\r\n"
                                   + "エラー メッセージ:" + errorMessage + "\r\n"
                                   + errorToString);
                }
            }
        }
Example #29
0
        /// <summary>
        /// B層の一般的な例外による異常終了の後処理を実装するUOCメソッド。
        /// </summary>
        /// <param name="parameterValue">引数クラス</param>
        /// <param name="returnValue">戻り値クラス</param>
        /// <param name="ex">Exception</param>
        /// <remarks>業務コード親クラス1から利用される派生の末端</remarks>
        protected override void UOC_ABEND(BaseParameterValue parameterValue, ref BaseReturnValue returnValue, Exception ex)
        {
            // 一般的な例外発生時の処理を実装
            // TODO:

            // nullチェック
            if (this.perfRec == null)
            {
                // なにもしない

                // リスロー
                throw ex;
            }
            else
            {
                // 性能測定終了
                this.perfRec.EndsPerformanceRecord();

                // キャスト
                MyParameterValue myPV = (MyParameterValue)parameterValue;

                // システム例外に振り替える用のワーク
                bool   sysErrorFlag      = false;
                string sysErrorMessageID = "";
                string sysErrorMessage   = "";

                #region 例外の振替処理のIF文

                if (ex.Message == "Other-Business")
                {
                    // 業務例外へ変換
                    returnValue.ErrorFlag      = true;
                    returnValue.ErrorMessageID = "振替後";
                    returnValue.ErrorMessage   = "振替後";
                    returnValue.ErrorInfo      = "振り替える場合は、基本的にここを利用。";
                }
                else if (ex.Message == "Other-System")
                {
                    // システム例外へ振替
                    sysErrorFlag      = true;
                    sysErrorMessageID = "振替後";
                    sysErrorMessage   = "振替後";
                }

                #endregion

                #region ACCESSログ出力、リスローする・しない

                if (returnValue.ErrorFlag)
                {
                    // 業務例外へ変換

                    // ------------
                    // メッセージ部
                    // ------------
                    // ユーザ名, IPアドレス, レイヤ,
                    // 画面名, コントロール名, メソッド名, 処理名
                    // 処理時間(実行時間), 処理時間(CPU時間)
                    // エラーメッセージID, エラーメッセージ等
                    // ------------
                    string strLogMessage =
                        "," + myPV.User.UserName +
                        "," + myPV.User.IPAddress +
                        "," + "<<-----" +
                        "," + myPV.ScreenId +
                        "," + myPV.ControlId +
                        "," + myPV.MethodName +
                        "," + myPV.ActionType +
                        "," + this.perfRec.ExecTime +
                        "," + this.perfRec.CpuTime +
                        "," + returnValue.ErrorMessageID +
                        "," + returnValue.ErrorMessage;

                    // Log4Netへログ出力
                    LogIF.WarnLog("ACCESS", strLogMessage);
                }
                else if (sysErrorFlag)
                {
                    // システム例外へ振替

                    // ------------
                    // メッセージ部
                    // ------------
                    // ユーザ名, IPアドレス, レイヤ,
                    // 画面名, コントロール名, メソッド名, 処理名
                    // 処理時間(実行時間), 処理時間(CPU時間)
                    // エラーメッセージID, エラーメッセージ等
                    // ------------
                    string strLogMessage =
                        "," + myPV.User.UserName +
                        "," + myPV.User.IPAddress +
                        "," + "<<-----" +
                        "," + myPV.ScreenId +
                        "," + myPV.ControlId +
                        "," + myPV.MethodName +
                        "," + myPV.ActionType +
                        "," + this.perfRec.ExecTime +
                        "," + this.perfRec.CpuTime +
                        "," + sysErrorMessageID +
                        "," + sysErrorMessage + "\r\n" + ex.StackTrace;

                    // Log4Netへログ出力
                    LogIF.ErrorLog("ACCESS", strLogMessage);

                    // 振替てスロー
                    throw new BusinessSystemException(sysErrorMessageID, sysErrorMessage);
                }
                else
                {
                    // そのまま

                    // ------------
                    // メッセージ部
                    // ------------
                    // ユーザ名, IPアドレス, レイヤ,
                    // 画面名, コントロール名, メソッド名, 処理名
                    // 処理時間(実行時間), 処理時間(CPU時間)
                    // エラーメッセージID, エラーメッセージ等
                    // ------------
                    string strLogMessage =
                        "," + myPV.User.UserName +
                        "," + myPV.User.IPAddress +
                        "," + "<<-----" +
                        "," + myPV.ScreenId +
                        "," + myPV.ControlId +
                        "," + myPV.MethodName +
                        "," + myPV.ActionType +
                        "," + this.perfRec.ExecTime +
                        "," + this.perfRec.CpuTime +
                        "," + "other Exception" +
                        "," + ex.Message + "\r\n" + ex.StackTrace;

                    // Log4Netへログ出力
                    LogIF.ErrorLog("ACCESS", strLogMessage);

                    // リスロー
                    throw ex;
                }

                #endregion
            }
        }
Example #30
0
        /// <summary>Soap & Bean 個別Soap Webメソッドの共通部</summary>
        /// <param name="context">コンテキスト</param>
        /// <param name="methodName">メソッド名</param>
        /// <param name="parameterValue">引数Bean(個別・・・サブ)</param>
        /// <param name="returnValue">戻り値Bean(個別・・・サブ)</param>
        /// <returns>返すべきエラーの情報</returns>
        private string Call(ref string context, string serviceName, string methodName, string actionType, object parameterValue, out object returnValue)
        {
            // ステータス
            string status = "-";

            // 初期化のため
            returnValue = "";

            #region 呼出し制御関係の変数

            // アセンブリ名
            string assemblyName = "";

            // クラス名
            string className = "";

            #endregion

            #region 引数・戻り値関係の変数

            // 引数・戻り値の.NETオブジェクト
            MuParameterValue muParameterValue = null;
            MuReturnValue    muReturnValue    = null;

            // エラー情報(XMLフォーマット)
            XmlDocument wsErrorInfo = new XmlDocument();
            XmlElement  wsErrorRoot = null;
            XmlElement  wsErrorItem = null;

            // エラー情報(ログ出力用)
            string errorType      = ""; // 2009/09/15-この行
            string errorMessageID = "";
            string errorMessage   = "";
            string errorToString  = "";

            #endregion

            try
            {
                // 開始ログの出力
                LogIF.InfoLog("SERVICE-IF", FxLiteral.SIF_STATUS_START);

                #region  前解決

                // ★
                status = FxLiteral.SIF_STATUS_NAME_SERVICE;

                // 名前解決(インプロセス)
                ServiceForSb.IPR_NS.NameResolution(serviceName, out assemblyName, out className);

                #endregion

                #region 引数の.NETオブジェクト化(UOC)

                // ★
                status = FxLiteral.SIF_STATUS_DESERIALIZE;

                // ★★ 引数の.NETオブジェクト化をUOCする(必要に応じて)。

                // 引数文字列の.NETオブジェクト化

                // string[] cmnParameterValueを使用して初期化するなど
                muParameterValue = new MuParameterValue(
                    "",         //cmnParameterValue[0], // 画面名
                    "",         //cmnParameterValue[1], // ボタン名
                    methodName, //cmnParameterValue[2], // メソッド名
                    actionType, //cmnParameterValue[3], // アクションタイプ
                    new MyUserInfo(context, HttpContext.Current.Request.UserHostAddress));

                // parameterValueを引数の文字列フィールドに設定
                muParameterValue.Bean = parameterValue;

                // 引数クラスをパラメタ セットに格納
                object[] paramSet = new object[] { muParameterValue, DbEnum.IsolationLevelEnum.User };

                #endregion

                #region 認証処理(UOC)

                // ★
                status = FxLiteral.SIF_STATUS_AUTHENTICATION;

                string access_token = (string)context;
                if (!string.IsNullOrEmpty(access_token))
                {
                    string        sub    = "";
                    List <string> roles  = null;
                    List <string> scopes = null;
                    JObject       jobj   = null;

                    if (JwtToken.Verify(access_token, out sub, out roles, out scopes, out jobj))
                    {
                        // 認証成功
                        Debug.WriteLine("認証成功");
                    }
                    else
                    {
                        // 認証失敗(認証必須ならエラーにする。
                    }
                }
                else
                {
                    // 認証失敗(認証必須ならエラーにする。
                }

                #endregion

                #region B層・D層呼出し

                // ★
                status = FxLiteral.SIF_STATUS_INVOKE;

                try
                {
                    // B層・D層呼出し

                    //// DLL名も指定するパターン(別DLLに含まれる)
                    //muReturnValue = (MuReturnValue)Latebind.InvokeMethod(
                    //    assemblyName, className, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet);

                    // DLL名は指定しないパターン(ExecutingAssemblyに含まれる)
                    Assembly asm = Assembly.GetExecutingAssembly();

                    // DLL名は指定しないパターンでの例外処理
                    Type t = asm.GetType(className);
                    if (t == null)
                    {
                        throw new BusinessSystemException("NoLBTypeInExecutingAssembly", string.Format("{0}クラスがExecutingAssemblyに存在しません。", className));
                    }

                    object o = Activator.CreateInstance(t);
                    muReturnValue = (MuReturnValue)Latebind.InvokeMethod(o, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet);
                }
                catch (System.Reflection.TargetInvocationException rtEx)
                {
                    // InnerExceptionを投げなおす。
                    throw rtEx.InnerException;
                }

                #endregion

                #region 戻り値

                // ★
                status = FxLiteral.SIF_STATUS_SERIALIZE;

                returnValue = muReturnValue.Bean;

                if (muReturnValue.ErrorFlag)
                {
                    // エラー情報を設定する。
                    wsErrorRoot = wsErrorInfo.CreateElement("ErrorInfo");
                    wsErrorInfo.AppendChild(wsErrorRoot);

                    // 業務例外
                    wsErrorItem           = wsErrorInfo.CreateElement("ErrorType");
                    wsErrorItem.InnerText = FxEnum.ErrorType.BusinessApplicationException.ToString();
                    wsErrorRoot.AppendChild(wsErrorItem);

                    wsErrorItem           = wsErrorInfo.CreateElement("MessageID");
                    wsErrorItem.InnerText = muReturnValue.ErrorMessageID;
                    wsErrorRoot.AppendChild(wsErrorItem);

                    wsErrorItem           = wsErrorInfo.CreateElement("Message");
                    wsErrorItem.InnerText = muReturnValue.ErrorMessage;
                    wsErrorRoot.AppendChild(wsErrorItem);

                    wsErrorItem           = wsErrorInfo.CreateElement("Information");
                    wsErrorItem.InnerText = muReturnValue.ErrorInfo;
                    wsErrorRoot.AppendChild(wsErrorItem);

                    // ログ出力用の情報を保存
                    errorType      = FxEnum.ErrorType.BusinessApplicationException.ToString(); // 2009/09/15-この行
                    errorMessageID = muReturnValue.ErrorMessageID;
                    errorMessage   = muReturnValue.ErrorMessage;
                    errorToString  = muReturnValue.ErrorInfo;

                    // エラー情報を戻す。
                    return(wsErrorInfo.InnerXml);
                }

                #endregion

                // ★
                status = "";

                // 戻り値を返す。
                return("");
            }
            //catch (BusinessApplicationException baEx)
            //{
            // ここには来ない↑
            //}
            catch (BusinessSystemException bsEx)
            {
                // エラー情報を設定する。
                wsErrorRoot = wsErrorInfo.CreateElement("ErrorInfo");
                wsErrorInfo.AppendChild(wsErrorRoot);

                // システム例外
                wsErrorItem           = wsErrorInfo.CreateElement("ErrorType");
                wsErrorItem.InnerText = FxEnum.ErrorType.BusinessSystemException.ToString();
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("MessageID");
                wsErrorItem.InnerText = bsEx.messageID;
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("Message");
                wsErrorItem.InnerText = bsEx.Message;
                wsErrorRoot.AppendChild(wsErrorItem);

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.BusinessSystemException.ToString(); // 2009/09/15-この行
                errorMessageID = bsEx.messageID;
                errorMessage   = bsEx.Message;

                errorToString = bsEx.ToString();

                // エラー情報を戻す。
                return(wsErrorInfo.InnerXml);
            }
            catch (FrameworkException fxEx)
            {
                // エラー情報を設定する。
                wsErrorRoot = wsErrorInfo.CreateElement("ErrorInfo");
                wsErrorInfo.AppendChild(wsErrorRoot);

                // フレームワーク例外
                // ★ インナーエクセプション情報は消失
                wsErrorItem           = wsErrorInfo.CreateElement("ErrorType");
                wsErrorItem.InnerText = FxEnum.ErrorType.FrameworkException.ToString();
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("MessageID");
                wsErrorItem.InnerText = fxEx.messageID;
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("Message");
                wsErrorItem.InnerText = fxEx.Message;
                wsErrorRoot.AppendChild(wsErrorItem);

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.FrameworkException.ToString(); // 2009/09/15-この行
                errorMessageID = fxEx.messageID;
                errorMessage   = fxEx.Message;

                errorToString = fxEx.ToString();

                // エラー情報を戻す。
                return(wsErrorInfo.InnerXml);
            }
            catch (Exception ex)
            {
                // エラー情報を設定する。
                wsErrorRoot = wsErrorInfo.CreateElement("ErrorInfo");
                wsErrorInfo.AppendChild(wsErrorRoot);

                // フレームワーク例外
                // ★ インナーエクセプション情報は消失
                wsErrorItem           = wsErrorInfo.CreateElement("ErrorType");
                wsErrorItem.InnerText = FxEnum.ErrorType.ElseException.ToString();
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("MessageID");
                wsErrorItem.InnerText = "-";
                wsErrorRoot.AppendChild(wsErrorItem);

                wsErrorItem           = wsErrorInfo.CreateElement("Message");
                wsErrorItem.InnerText = ex.ToString();
                wsErrorRoot.AppendChild(wsErrorItem);

                // ログ出力用の情報を保存
                errorType      = FxEnum.ErrorType.ElseException.ToString(); // 2009/09/15-この行
                errorMessageID = "-";
                errorMessage   = ex.Message;

                // どちらを戻すべきか?
                // Muの場合は、Messageがデフォ
                errorToString = ex.Message;
                //errorToString = ex.ToString();

                // エラー情報を戻す。
                return(wsErrorInfo.InnerXml);
                //throw; // コメントアウト
            }
            finally
            {
                // 用途によってSessionを解放するかどうかを検討。

                //// Sessionステートレス
                //Session.Clear();
                //Session.Abandon();

                // 終了ログの出力
                if (status == "")
                {
                    // 終了ログ出力
                    LogIF.InfoLog("SERVICE-IF", "正常終了");
                }
                else
                {
                    // 終了ログ出力
                    LogIF.ErrorLog("SERVICE-IF",
                                   "異常終了"
                                   + ":" + status + "\r\n"
                                   + "エラー タイプ:" + errorType + "\r\n" // 2009/09/15-この行
                                   + "エラー メッセージID:" + errorMessageID + "\r\n"
                                   + "エラー メッセージ:" + errorMessage + "\r\n"
                                   + errorToString + "\r\n");
                }
            }
        }