/// <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(); } }
/// <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); }
/// <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; }
/// <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); } // ------------------------------------------------------------- }
/// <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); // ------------------------------------------------------------- }
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; } }
/// <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")); }
/// <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); } // ------------------------------------------------------------- }
/// <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())); } }
/// <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); }
/// <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())); } } }
/// <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"); } } }
/// <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); } } }
/// <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"); } } }
/// <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"); } } }
/// <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"); } } }
/// <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 } }
/// <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--; } }