Example #1
0
        /// <summary>
        /// Sets all intial values to member variables from the .config file
        /// </summary>
        public void SetFromConfig()
        {
            try
            {
                // Get maximum thread count from .config file
                string maxThreadCount = GetConfigParameter.GetConfigValue("FxMaxThreadCount");
                if (string.IsNullOrEmpty(maxThreadCount))
                {
                    // Set default
                    _maxThreadCount = 10;
                }
                else
                {
                    _maxThreadCount = int.Parse(maxThreadCount);
                }

                // Get number of seconds from .config file
                string numberOfSeconds = GetConfigParameter.GetConfigValue("FxMaxThreadCount");
                if (string.IsNullOrEmpty(numberOfSeconds))
                {
                    // Set default
                    _numberOfSeconds = 1;
                }
                else
                {
                    _numberOfSeconds = int.Parse(numberOfSeconds);
                }

                // Get maximum number of retries from .config file
                string maxNumberOfRetries = GetConfigParameter.GetConfigValue("FxMaxNumberOfRetries");
                if (string.IsNullOrEmpty(maxNumberOfRetries))
                {
                    // Set default
                    _maxNumberOfRetries = 10;
                }
                else
                {
                    _maxNumberOfRetries = int.Parse(maxNumberOfRetries);
                }

                // Get maximum number of hours from .config file
                string maxNumberOfHours = GetConfigParameter.GetConfigValue("FxMaxNumberOfHours");
                if (string.IsNullOrEmpty(maxNumberOfHours))
                {
                    // Set default
                    _maxNumberOfHours = 24;
                }
                else
                {
                    // Get maximum number of hours from .config file
                    _maxNumberOfHours = int.Parse(maxNumberOfHours);
                }
            }
            catch
            {
                // Error while setting from config
                LogIF.ErrorLog("ASYNC-SERVICE", GetMessage.GetMessageDescription("E0007"));
                throw new Exception();
            }
        }
Example #2
0
        /// <summary>エラーログの出力</summary>
        /// <param name="filterContext">ExceptionContext</param>
        private void OutputErrorLog(ExceptionContext filterContext)
        {
            // 非同期ControllerのInnerException対策(底のExceptionを取得する)。
            Exception ex = filterContext.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 #3
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
            AsyncProcessingServiceParameterValue asyncParameterValue = new AsyncProcessingServiceParameterValue("AsyncProcessingService", "StopAllTask", "StopAllTask", "SQL",
                                                                                                                new MyUserInfo("AsyncProcessingService", "AsyncProcessingService"));

            asyncParameterValue.StatusId  = (int)AsyncProcessingServiceParameterValue.AsyncStatus.Processing;
            asyncParameterValue.CommandId = (int)AsyncProcessingServiceParameterValue.AsyncCommand.Stop;
            LayerB layerB = new LayerB();
            AsyncProcessingServiceReturnValue asyncReturnValue = (AsyncProcessingServiceReturnValue)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"));
        }
        /// <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へログ出力
            if (string.IsNullOrEmpty(GetConfigParameter.GetConfigValue(PubLiteral.SQL_TRACELOG)))
            {
                // 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 #5
0
        /// <summary>
        /// B層のシステム例外による異常終了の後処理を実装するUOCメソッド。
        /// </summary>
        /// <param name="parameterValue">引数クラス</param>
        /// <param name="returnValue">戻り値クラス</param>
        /// <param name="bsEx">BusinessSystemException</param>
        /// <remarks>業務コード親クラス1から利用される派生の末端</remarks>
        protected override void UOC_ABEND(BaseParameterValue parameterValue, BaseReturnValue returnValue, BusinessSystemException bsEx)
        {
            // システム例外発生時の処理を実装
            // TODO:

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

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

                MyParameterValue myPV = (MyParameterValue)parameterValue;

                // ------------
                // メッセージ部
                // ------------
                // ユーザ名, 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 +
                    "," + bsEx.messageID +
                    "," + bsEx.Message + "\r\n";
                // OriginalStackTrace(ログ出力)の品質向上
                if (this.OriginalStackTrace == "")
                {
                    strLogMessage += bsEx.StackTrace;
                }
                else
                {
                    strLogMessage += this.OriginalStackTrace;
                }

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

            // -------------------------------------------------------------
        }
Example #6
0
        /// <summary>システム例外発生時の処理を実装</summary>
        /// <param name="bsEx">BusinessSystemException</param>
        /// <param name="rcFxEventArgs">イベントハンドラの共通引数</param>
        /// <remarks>画面コード親クラス1から利用される派生の末端</remarks>
        protected override void UOC_ABEND(BusinessSystemException bsEx, RcFxEventArgs rcFxEventArgs)
        {
            // システム例外発生時の処理を実装
            // TODO:

            // 性能測定終了

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

            this.perfRec.EndsPerformanceRecord();

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

            if (MyBaseControllerWin.CanOutPutLog)
            {
                // ------------
                // メッセージ部
                // ------------
                // ユーザ名, レイヤ, 画面名, コントロール名,
                // 処理時間(実行時間), 処理時間(CPU時間)
                // エラーメッセージID, エラーメッセージ等
                // ------------
                string strLogMessage =
                    "," + UserInfo.UserName +
                    "," + "<-----" +
                    "," + this.Name +
                    "," + rcFxEventArgs.ControlName +
                    "," + this.perfRec.ExecTime +
                    "," + this.perfRec.CpuTime +
                    "," + bsEx.messageID +
                    "," + bsEx.Message + "\r\n" + this.OriginalStackTrace;
                // OriginalStackTrace(ログ出力)の品質向上
                if (this.OriginalStackTrace == "")
                {
                    strLogMessage += bsEx.StackTrace;
                }
                else
                {
                    strLogMessage += this.OriginalStackTrace;
                }

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

            // -------------------------------------------------------------
        }
        /// <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" +
                ex.ToString(); // ex

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

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

            // エラー画面に画面遷移する ------------------------------------
            this.TransferErrorScreen(ex);
            // -------------------------------------------------------------
        }
Example #8
0
 public void ErrorLog_Test(string loggerName, string message)
 {
     try
     {
         LogIF.ErrorLog(loggerName, message);
     }
     catch (Exception ex)
     {
         // Print a stack trace when an exception occurs.
         Console.WriteLine(":" + ex.StackTrace);
         throw;
     }
 }
Example #9
0
 /// <summary>
 ///  To handle pre-shutdown notification technique
 /// </summary>
 /// <param name="command">pre-shutdown command</param>
 protected override void OnCustomCommand(int command)
 {
     if (command == SERVICE_CONTROL_PRESHUTDOWN)
     {
         // To execute pre-shutdown notification technique
         LogIF.ErrorLog("ASYNC-SERVICE", GetMessage.GetMessageDescription("E0008"));
         this.StopAsyncProcess();
     }
     else
     {
         // OS may shutdown with other than pre-shutdown command, Async Service may not terminated properly
         LogIF.ErrorLog("ASYNC-SERVICE", GetMessage.GetMessageDescription("E0010"));
         this.StopAsyncProcess();
         base.OnCustomCommand(command);
     }
     LogIF.InfoLog("ASYNC-SERVICE", GetMessage.GetMessageDescription("I0009"));
 }
Example #10
0
        /// <summary>一般的な例外発生時の処理を実装</summary>
        /// <param name="ex">例外オブジェクト</param>
        /// <param name="rcFxEventArgs">イベントハンドラの共通引数</param>
        /// <remarks>画面コード親クラス1から利用される派生の末端</remarks>
        protected override void UOC_ABEND(Exception ex, RcFxEventArgs rcFxEventArgs)
        {
            // 一般的な例外発生時の処理を実装
            // TODO:

            // 性能測定終了

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

            this.perfRec.EndsPerformanceRecord();

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

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

                // Log4Netへログ出力
                LogIF.ErrorLog("ACCESS", strLogMessage);
            }
            // -------------------------------------------------------------
        }
Example #11
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 #12
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 #13
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 #14
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 #15
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");
                }
            }
        }
        /// <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 #17
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");
                }
            }
        }
Example #18
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 #19
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 #20
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 #21
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--;
            }
        }