/// <summary>ウィンドウ インスタンスを取得</summary> /// <param name="formType">型情報(form)</param> /// <returns>ウィンドウ インスタンス一覧</returns> public static List <Form> GetWindowInstances(Type formType) { if (Latebind.CheckTypeOfBaseClass(formType, typeof(Form))) { // 正しい型 //lock (_lock) //{ if (BaseControllerWin._windowInstances.ContainsKey(formType)) { // エントリあり return(BaseControllerWin._windowInstances[formType]); } else { // エントリなし(空のリスト) return(new List <Form>()); } //} } else { // 不正な型(空のリスト) return(new List <Form>()); } }
/// <summary>当該Form型ウィンドウ数を取得</summary> /// <param name="formType">当該Form型情報</param> /// <returns>当該Form型ウィンドウ数</returns> public static int GetWindowsCount(Type formType) { if (Latebind.CheckTypeOfBaseClass(formType, typeof(Form))) { // 正しい型 //lock (_lock) //{ if (BaseControllerWin._dicWindowsCount.ContainsKey(formType)) { // エントリあり return(BaseControllerWin._dicWindowsCount[formType]); } else { // エントリなし return(0); } //} } else { // 不正な型 return(-1); } }
/// <summary>自動振り分け処理</summary> /// <param name="parameterValue">引数クラス</param> /// <param name="returnValue">戻り値クラス</param> protected override void UOC_DoAction(BaseParameterValue parameterValue, ref BaseReturnValue returnValue) { // メソッド名を生成 string methodName = "UOC_" + parameterValue.MethodName; #region レイトバインドする object[] paramSet = new object[] { parameterValue }; try { // Latebind Latebind.InvokeMethod(this, methodName, paramSet); } catch (System.Reflection.TargetInvocationException rtEx) { // スタックトレースを保って InnerException を throw ExceptionDispatchInfo.Capture(rtEx.InnerException).Throw(); } finally { // レイトバインドにおいて、 // ・ 戻り値(in)の場合、下位で生成した戻り値インスタンスは戻らない。 // ・ 戻り値(ref, out)の場合、例外発生時は戻り値インスタンスは戻らない。 // という問題がある。 // ∴ (特に後者の対応のため、) // メンバ変数を使用して戻り値インスタンスを戻す。 returnValue = this.ReturnValue; } #endregion }
public void CheckTypeOfBaseClassTest(Type classType, Type baseType) { try { Assert.IsTrue(Latebind.CheckTypeOfBaseClass(classType, baseType)); } catch (Exception ex) { Console.WriteLine(ex.StackTrace); throw; } }
public void CheckTypeOfMethodByNameTest(object obj, string methodName) { try { //Parameters Assert.IsTrue(Latebind.CheckTypeOfMethodByName(obj, methodName)); } catch (Exception ex) { Console.WriteLine(ex.StackTrace); throw; } }
public void InvokeMethod_NoErrTest(string assemblyName, string className, string methodName, object[] paramSet) { try { object results = Latebind.InvokeMethod_NoErr(assemblyName, className, methodName, paramSet); Assert.NotNull(results); } catch (Exception ex) { Console.WriteLine(ex.StackTrace); throw; } }
public void InvokeMethod1Test(object objectClass, string methodName, object[] paramSet) { try { object results = Latebind.InvokeMethod(objectClass, methodName, paramSet); Assert.NotNull(results); } catch (Exception ex) { Console.WriteLine(ex.StackTrace); throw; } }
/// <summary>自動振り分け処理</summary> /// <param name="parameterValue">引数クラス</param> /// <param name="returnValue">戻り値クラス</param> protected override void UOC_DoAction(BaseParameterValue parameterValue, ref BaseReturnValue returnValue) { // メソッド名を生成 string methodName = "UOC_" + parameterValue.MethodName; #region レイトバインドする object[] paramSet = new object[] { parameterValue }; try { // Latebind Latebind.InvokeMethod(this, methodName, paramSet); } catch (System.Reflection.TargetInvocationException rtEx) { // InnerExceptionのスタックトレースを保存しておく(以下のリスローで消去されるため)。 this.OriginalStackTrace = rtEx.InnerException.StackTrace; // InnerExceptionを投げなおす。 throw rtEx.InnerException; } finally { // レイトバインドにおいて、 // ・ 戻り値(in)の場合、下位で生成した戻り値インスタンスは戻らない。 // ・ 戻り値(ref, out)の場合、例外発生時は戻り値インスタンスは戻らない。 // という問題がある。 // ∴ (特に後者の対応のため、) // メンバ変数を使用して戻り値インスタンスを戻す。 returnValue = this.ReturnValue; } #endregion }
/// <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>サービス インターフェイスに対するクライアント モジュール</summary> /// <param name="serviceName">サービス名</param> /// <param name="parameterValue">引数</param> /// <returns>戻り値</returns> /// <remarks>自由に利用できる。</remarks> public object Invoke(string serviceName, object parameterValue) { #region 呼出し制御関係の変数 // プロトコル string protocol = ""; // モジュール名 string assemblyName = ""; // クラス名 string className = ""; // URL string url = ""; // タイムアウト int timeout; // プロパティ Dictionary <string, string> props; #endregion #region 引数・戻り値関係の変数(WS時) // .NETオブジェクトのバイト配列 // #y-↓3行 byte[] contextObject = null; byte[] parameterValueObject = null; byte[] returnValueObject = null; // エラー情報のバイト配列 // #y-↓1行 byte[] ret = null; #endregion // 名前解決(プロトコル タイプ) CallController.PRT_NS.NameResolutionProtocolType(serviceName, out protocol); if (protocol == ((int)FxEnum.TmProtocol.InProcess).ToString()) { #region インプロセス呼び出し // 名前解決(インプロセス) CallController.IPR_NS.NameResolution(serviceName, out assemblyName, out className); // 引数クラスをパラメタ セットに格納 object[] paramSet = new object[] { parameterValue, DbEnum.IsolationLevelEnum.User }; // #30-start try { // B層→D層呼出し return((BaseReturnValue)Latebind.InvokeMethod( assemblyName, className, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet)); //// 2009/08/10-以下のコードブロック //DirectoryInfo dir = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "\\bin"); //// 実行環境によって処理を変える。 //if (dir.Exists) //{ // // binが存在する場合(通常、Webのケース) // return (BaseReturnValue)Latebind.InvokeMethod( // AppDomain.CurrentDomain.BaseDirectory + "\\bin\\" + assemblyName + ".dll", // className, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet); //} //else //{ // // binが存在しない場合(通常、Web以外のケース) // return (BaseReturnValue)Latebind.InvokeMethod( // AppDomain.CurrentDomain.BaseDirectory + "\\" + assemblyName + ".dll", // className, FxLiteral.TRANSMISSION_INPROCESS_METHOD_NAME, paramSet); //} } catch (System.Reflection.TargetInvocationException rtEx) { // InnerExceptionを投げなおす。 throw rtEx.InnerException; } // #30-end #endregion } else { #region サービス呼び出し // 名前解決(プロトコルURL) CallController.PRT_NS.NameResolutionProtocolUrl(serviceName, out url, out timeout, out props); #region 引数のシリアライズ(#y-このregion) // nullチェック if (this._context == null) { // コンテキスト・nullエラー throw new FrameworkException( FrameworkExceptionMessage.PARAMETER_CHECK_ERROR[0], String.Format(FrameworkExceptionMessage.PARAMETER_CHECK_ERROR[1], String.Format(FrameworkExceptionMessage.PARAMETER_CHECK_ERROR_null, "context"))); } else { // 変換 contextObject = BinarySerialize.ObjectToBytes(this._context); } // nullチェック if (parameterValue == null) { // 引数・nullエラー throw new FrameworkException( FrameworkExceptionMessage.PARAMETER_CHECK_ERROR[0], String.Format(FrameworkExceptionMessage.PARAMETER_CHECK_ERROR[1], String.Format(FrameworkExceptionMessage.PARAMETER_CHECK_ERROR_null, "parameterValue"))); } else { // 変換 parameterValueObject = BinarySerialize.ObjectToBytes(parameterValue); } #endregion if (protocol == ((int)FxEnum.TmProtocol.AspNetWs).ToString()) { #region WS-I Basic Profile v1.1、IIS + ASP.NET // 都度newしても接続はプールされているので、オーバーヘッドは少ない。 WR = new Reference(); #region プロパティの設定 #region URL、タイムアウト // URL WR.Url = url; // タイムアウト WR.Timeout = timeout * 1000; #endregion #region その他(固定) // 実行アカウントでのWindows認証の有効・無効(Default:false)。 WR.UseDefaultCredentials = true; // 有効 // 事前認証の有効・無効(Default:false)。 WR.PreAuthenticate = false; // 無効 // → 認証後の要求でも「WWW-authenticate HTTP」ヘッダーを // ・ 送信する場合 :true // ・ それ以外の場合:false // Webサービスを要求するときに使用されるEncoding(Default:UTF-8)。 WR.RequestEncoding = Encoding.GetEncoding(CustomEncode.UTF_8); // #36-この行 // → サービスIFの仕様として「UTF-8」前提で考える。 // Cookieの有効・無効(Default:null) WR.CookieContainer = null; // 無効 // Redirectを受け付けるか、受け付けないか(Default:false) WR.AllowAutoRedirect = false; // 受け付けない // SOAP プロトコルのバージョン(Default:Soap11) // WR.SoapProtocolVersion // 変更しない; // NTLM認証で、接続共有の有効・無効(Default:false) // WR.UnsafeAuthenticatedConnectionSharing // 変更しない; // Componentを格納しているIContainer // WR.Container // 変更しない; // ComponentのISite // WR.Site // 変更しない; #endregion #region その他(props) // #x-start #region WASのクライアント認証のセキュリティ資格情報 // WASのセキュリティ資格情報 if (this._nwcWAS == null) { // ユーザ指定:なし if (!props.ContainsKey(FxLiteral.TRANSMISSION_HTTP_PROP_USER_NAME))// Dic化でnullチェック変更 { // XML定義:キーが無い } else { if (props[FxLiteral.TRANSMISSION_HTTP_PROP_USER_NAME] == null || (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_USER_NAME] == "") { // XML定義:null or 空文字列 } else { // XML定義:あり // WASのセキュリティ資格情報を生成する。 NetworkCredential nwcWAS = new NetworkCredential(); nwcWAS.UserName = (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_USER_NAME]; nwcWAS.Password = (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_PASSWORD]; // 省略可能に変更した。 if (props.ContainsKey(FxLiteral.TRANSMISSION_HTTP_PROP_DOMAIN)) { nwcWAS.Domain = (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_DOMAIN]; } // WASのセキュリティ資格情報を設定する(XML定義)。 WR.Credentials = nwcWAS; } } } else { // ユーザ指定:あり // WASのセキュリティ資格情報を設定する(ユーザ指定)。 WR.Credentials = this._nwcWAS; } #endregion #region プロキシ経由の要求を行うためのプロキシ情報 // プロキシ WebProxy proxy = null; #region プロキシ生成 if (this._proxyUrl == null || this._proxyUrl == "") { // ユーザ指定:なし if (!props.ContainsKey(FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_URL))// Dic化でnullチェック変更 { // XML定義:キーが無い } else { if (props[FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_URL] == null || (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_URL] == "") { // XML定義:null or 空文字列 } else { // XML定義:あり // プロキシを生成(XML定義) proxy = new WebProxy(new Uri((string)props[FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_URL])); } } } else { // ユーザ指定:あり // プロキシを生成(ユーザ指定) proxy = new WebProxy(new Uri(this._proxyUrl)); } #endregion #region プロキシの有・無 if (proxy == null) { // プロキシがない } else { // プロキシがある // ローカル プロキシをバイパスの有効・無効(Default:false)。 proxy.BypassProxyOnLocal = false; // 無効 // 実行アカウントでのWindows認証の有効・無効(Default:false)。 proxy.UseDefaultCredentials = true; // 有効 #region Proxyのクライアント認証のセキュリティ資格情報 // Proxyのセキュリティ資格情報 if (this._nwcProxy == null) { // ユーザ指定:なし if (!props.ContainsKey(FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_USER_NAME))// Dic化でnullチェック変更 { // XML定義:キーが無い } else { if (props[FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_USER_NAME] == null || (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_USER_NAME] == "") { // XML定義:null or 空文字列 } else { // XML定義:あり // Proxyのセキュリティ資格情報を生成する。 NetworkCredential nwcProxy = new NetworkCredential(); nwcProxy.UserName = (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_USER_NAME]; nwcProxy.Password = (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_PASSWORD]; // 省略可能に変更した。 if (props.ContainsKey(FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_DOMAIN)) { nwcProxy.Domain = (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_PROXY_DOMAIN]; } // Proxyのセキュリティ資格情報を設定する(XML定義)。 proxy.Credentials = nwcProxy; } } } else { // ユーザ指定:あり // Proxyのセキュリティ資格情報を設定する(ユーザ指定)。 proxy.Credentials = this._nwcProxy; } #endregion // プロキシ情報を設定する。 WR.Proxy = proxy; } #endregion #endregion #region クライアント証明書、HTTP圧縮、エージェント ヘッダ、接続グループ.etc #region クライアント証明書(#z-このregion) // http://support.microsoft.com/kb/895971/ja // http://msdn.microsoft.com/ja-jp/library/system.security.cryptography.x509certificates.x509certificate.x509certificate.aspx if (!props.ContainsKey(FxLiteral.TRANSMISSION_HTTP_PROP_X509CERTIFICATE_FILE))// Dic化でnullチェック変更 { // XML定義:キーが無い } else { if (props[FxLiteral.TRANSMISSION_HTTP_PROP_X509CERTIFICATE_FILE] == null || (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_X509CERTIFICATE_FILE] == "") { // XML定義:null or 空文字列 } else { if (!props.ContainsKey(FxLiteral.TRANSMISSION_HTTP_PROP_X509CERTIFICATE_PASSWORD))// Dic化でnullチェック変更 { // XML定義:キーが無い // クライアント証明書のファイルパス WR.ClientCertificates.Add( new X509Certificate((string)props[FxLiteral.TRANSMISSION_HTTP_PROP_X509CERTIFICATE_FILE])); } else { if (props[FxLiteral.TRANSMISSION_HTTP_PROP_X509CERTIFICATE_PASSWORD] == null || (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_X509CERTIFICATE_PASSWORD] == "") { // XML定義:null or 空文字列 // クライアント証明書のファイルパス WR.ClientCertificates.Add( new X509Certificate((string)props[FxLiteral.TRANSMISSION_HTTP_PROP_X509CERTIFICATE_FILE])); } else { // XML定義:あり // クライアント証明書のファイルパス + クライアント証明書DBのパスワード WR.ClientCertificates.Add( new X509Certificate( (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_X509CERTIFICATE_FILE], (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_X509CERTIFICATE_PASSWORD])); } } } } #endregion #region HTTP圧縮の有効・無効(Default:false) if (!props.ContainsKey(FxLiteral.TRANSMISSION_HTTP_PROP_ENABLEDE_COMPRESSION))// Dic化でnullチェック変更 { // XML定義:キーが無い } else { if (props[FxLiteral.TRANSMISSION_HTTP_PROP_ENABLEDE_COMPRESSION] == null || (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_ENABLEDE_COMPRESSION] == "") { // XML定義:null or 空文字列 } else { // XML定義:あり bool temp; if (Boolean.TryParse((string)props[FxLiteral.TRANSMISSION_HTTP_PROP_ENABLEDE_COMPRESSION], out temp)) { // 書式正常 WR.EnableDecompression = temp; } else { // パラメータ・エラー(書式不正) throw new FrameworkException( FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_SWITCH2[0], String.Format(FrameworkExceptionMessage.ERROR_IN_WRITING_OF_FX_SWITCH2[1], FxLiteral.TRANSMISSION_HTTP_PROP_ENABLEDE_COMPRESSION + "=" + props[FxLiteral.TRANSMISSION_HTTP_PROP_ENABLEDE_COMPRESSION])); } } } #endregion #region ユーザ エージェント ヘッダ値 // (Default:MS Web Services Client Protocol number、numberは、CLRのver) if (!props.ContainsKey(FxLiteral.TRANSMISSION_HTTP_PROP_USER_AGENT))// Dic化でnullチェック変更 { // XML定義:キーが無い } else { if (props[FxLiteral.TRANSMISSION_HTTP_PROP_USER_AGENT] == null || (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_USER_AGENT] == "") { // XML定義:null or 空文字列 } else { // XML定義:あり WR.UserAgent = (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_USER_AGENT]; // #34-この行 } } #endregion #region 接続グループ(Default:Empty) if (!props.ContainsKey(FxLiteral.TRANSMISSION_HTTP_PROP_CONNECTION_GROUP_NAME))// Dic化でnullチェック変更 { // XML定義:キーが無い } else { if (props[FxLiteral.TRANSMISSION_HTTP_PROP_CONNECTION_GROUP_NAME] == null || (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_CONNECTION_GROUP_NAME] == "") { // XML定義:null or 空文字列 } else { // XML定義:あり WR.ConnectionGroupName = (string)props[FxLiteral.TRANSMISSION_HTTP_PROP_CONNECTION_GROUP_NAME]; } } #endregion #endregion // #x-end #endregion #endregion // 同期呼び出しで実行 ret = WR.DotNETOnlineWS( serviceName, ref contextObject, parameterValueObject, out returnValueObject); // #x-この行 #endregion } else if (protocol == ((int)FxEnum.TmProtocol.WCF_HTTP).ToString()) { #region WCF : basicHTTPBinding、wsHTTPBinding // 都度newしても接続はプールされているので、オーバーヘッドは少ない(と思われる)。 this.WCF_HTTP = new WCFHTTPSvcForFxClient(this.WCF_HTTP_EndPointConfigName, url); #region プロパティの設定 // 現時点では全てConfig任せ(WCF_HTTP_EndPointConfigName) #endregion // 同期呼び出しで実行(なぜか並びが変わるWCF_HTTP) ret = this.WCF_HTTP.DotNETOnlineWS( serviceName, ref contextObject, out returnValueObject, parameterValueObject); #endregion } else if (protocol == ((int)FxEnum.TmProtocol.WCF_TCPIP).ToString()) { #region WCF : netTCPBinding // 都度newしても接続はプールされているので、オーバーヘッドは少ない(と思われる)。 ChannelFactory <IWCFTCPSvcForFx> factory = new ChannelFactory <IWCFTCPSvcForFx>( this.WCF_TCPIP_EndPointConfigName, new EndpointAddress(url)); this.WCF_TCPIP = factory.CreateChannel(); try { #region プロパティの設定 // 現時点では全てConfig任せ(WCF_HTTP_EndPointConfigName) #endregion // 同期呼び出しで実行 ret = this.WCF_TCPIP.DotNETOnlineTCP( serviceName, ref contextObject, parameterValueObject, out returnValueObject); } finally { // Close、Disposeを実行する。 // http://geekswithblogs.net/SoftwareDoneRight/archive/2008/05/23/clean-up-wcf-clients--the-right-way.aspx if (this.WCF_TCPIP != null) { ((IClientChannel)this.WCF_TCPIP).Close(); ((IDisposable)this.WCF_TCPIP).Dispose(); this.WCF_TCPIP = null; } } #endregion } else { // 定義が間違っている(エラー)。 // エラーをスロー throw new FrameworkException( FrameworkExceptionMessage.PRT_NAMESERVICE_XML_FORMAT_ERROR[0], String.Format(FrameworkExceptionMessage.PRT_NAMESERVICE_XML_FORMAT_ERROR[1], String.Format(FrameworkExceptionMessage.PRT_NAMESERVICE_XML_FORMAT_ERROR_prt2, protocol, serviceName))); // #14,32-この行 } #region 戻り値のデシリアライズ(#y-このregion) #region エラー情報 if (ret == null) { // 正常(例外発生:無し) } else { // 異常(例外発生:有り) // 例外処理 WSErrorInfo wsErrorInfo = (WSErrorInfo)BinarySerialize.BytesToObject(ret); if (wsErrorInfo.ErrorType == FxEnum.ErrorType.BusinessApplicationException) // #18-このコードブロック { // 業務例外 throw new BusinessApplicationException( wsErrorInfo.ErrorMessageID, wsErrorInfo.ErrorMessage, wsErrorInfo.ErrorInformation); } else if (wsErrorInfo.ErrorType == FxEnum.ErrorType.BusinessSystemException) { // システム例外 throw new BusinessSystemException( wsErrorInfo.ErrorMessageID, wsErrorInfo.ErrorMessage); } else if (wsErrorInfo.ErrorType == FxEnum.ErrorType.FrameworkException) { // フレームワーク例外 throw new FrameworkException( wsErrorInfo.ErrorMessageID, wsErrorInfo.ErrorMessage); } } #endregion #region 処理結果 // チェック処理 if (returnValueObject == null) { // 戻り値・空エラー throw new FrameworkException( FrameworkExceptionMessage.PARAMETER_CHECK_ERROR[0], String.Format(FrameworkExceptionMessage.PARAMETER_CHECK_ERROR[1], String.Format(FrameworkExceptionMessage.PARAMETER_CHECK_ERROR_null, "returnValueObject"))); } else { // 戻り値の復元 this._context = BinarySerialize.BytesToObject(contextObject); return((BaseReturnValue)BinarySerialize.BytesToObject(returnValueObject)); } #endregion #endregion #endregion } }
/// <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>キーイベント</summary> private void Form_CMNEventHandler(object sender, EventArgs e) { // メソッド名 string methodName = "UOC_Form_"; // イベント名 string eventName = ""; // ((Control)sender).Name + "_"; // イベントを識別 if (e is KeyEventArgs) { string temp = ""; KeyEventArgs kea = (KeyEventArgs)e; if (this._eventID == "KeyDown") { // KeyDownイベント if (kea.KeyCode == Keys.Enter) { temp = "Enter"; } else if (kea.KeyCode == Keys.F1) { temp = "F1"; } else if (kea.KeyCode == Keys.F2) { temp = "F2"; } else if (kea.KeyCode == Keys.F3) { temp = "F3"; } else if (kea.KeyCode == Keys.F4) { if (kea.Alt) { temp = "AltAndF4"; } else { temp = "F4"; } } else if (kea.KeyCode == Keys.F5) { temp = "F5"; } else if (kea.KeyCode == Keys.F6) { temp = "F6"; } else if (kea.KeyCode == Keys.F7) { temp = "F7"; } else if (kea.KeyCode == Keys.F8) { temp = "F8"; } else if (kea.KeyCode == Keys.F9) { temp = "F9"; } else if (kea.KeyCode == Keys.F10) { temp = "F10"; } else if (kea.KeyCode == Keys.F11) { temp = "F11"; } else if (kea.KeyCode == Keys.F12) { temp = "F12"; } } else if (this._eventID == "KeyPress") { } else if (this._eventID == "KeyUp") { } // イベント名を指定 eventName += temp + "_" + this._eventID; // メソッド名を指定 methodName += temp + "_" + this._eventID; } else if (e is FormClosingEventArgs) { // FormClosingイベント // イベント名を指定 eventName += "Closing"; // メソッド名を指定 methodName += "Closing"; } //else if (e is xxx) { } // イベント実行 if (Latebind.CheckTypeOfMethodByName(this, methodName)) { // イベント引数の作成 RcFxEventArgs rcFxEventArgs = new RcFxEventArgs(eventName, methodName, sender, e); try { // 開始処理を実行する。 this.UOC_PreAction(rcFxEventArgs); // イベント処理を実行する。 Latebind.InvokeMethod_NoErr(this, methodName, new object[] { rcFxEventArgs }); // 終了処理を実行する。 this.UOC_AfterAction(rcFxEventArgs); } catch (BusinessApplicationException baEx) { // アプリケーション例外発生時の処理を実行する。 this.UOC_ABEND(baEx, rcFxEventArgs); // アプリケーション例外はリスローしない。 } catch (BusinessSystemException bsEx) { // システム例外発生時の処理を実行する。 this.UOC_ABEND(bsEx, rcFxEventArgs); // システム例外はリスローする。 throw; } catch (Exception ex) { // 一般的な例外発生時の処理を実行する。 this.UOC_ABEND(ex, rcFxEventArgs); // 一般的な例外はリスローする。 throw; } finally { // Finally節のUOCメソッド this.UOC_Finally(rcFxEventArgs); } } }
public void Initialize() { //New instance of Latebind _latebind = new Latebind(); }
/// <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> /// 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"); } } }