Ejemplo n.º 1
0
        /// <summary>
        /// WCF TCP/IPサービスを使用した
        /// サービス インターフェイス基盤(.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[] DotNETOnlineTCP(
            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;

                // 名前解決(インプロセス)
                WCFTCPSvcForFx.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;

                if (context is string)
                {
                    // System.Stringの場合
                    string access_token = (string)context;
                    if (!string.IsNullOrEmpty(access_token))
                    {
                        string        sub    = "";
                        List <string> roles  = null;
                        List <string> scopes = null;
                        JObject       jobj   = null;

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

                //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 + "\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");
                }
            }
        }
Ejemplo n.º 3
0
        /// <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
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// ASP.NET Webサービスを使用した
        /// サービス インターフェイス基盤(.NETオンライン)
        /// </summary>
        /// <param name="serviceName">サービス名</param>
        /// <param name="contextObject">コンテキスト</param>
        /// <param name="parameterValueObject">引数</param>
        /// <param name="returnValueObject">戻り値</param>
        /// <returns>返すべきエラーの情報</returns>
        /// <remarks>値は全て.NETオブジェクトをバイナリシリアライズしたバイト配列データ</remarks>
        public byte[] DotNETOnlineWS(
            string serviceName, ref byte[] contextObject,
            byte[] parameterValueObject, out byte[] returnValueObject)
        {
            // ステータス
            string status = "-";

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

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

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

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

            #endregion

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

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

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

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

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

            #endregion

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

                #region  前解決

                // ★
                status = FxLiteral.SIF_STATUS_NAME_SERVICE;

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

                #endregion

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

                // ★
                status = FxLiteral.SIF_STATUS_DESERIALIZE;

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

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

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

                #endregion

                #region 認証処理のUOC

                // ★
                status = FxLiteral.SIF_STATUS_AUTHENTICATION;

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

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

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

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

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

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

                #endregion

                #region B層・D層呼出し

                // ★
                status = FxLiteral.SIF_STATUS_INVOKE;

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

                #endregion

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

                // ★
                status = FxLiteral.SIF_STATUS_SERIALIZE;

                returnValueObject = BinarySerialize.ObjectToBytes(returnValue);

                #endregion

                // ★
                status = "";

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

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

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

                errorToString = bsEx.ToString();

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

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

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

                errorToString = fxEx.ToString();

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

                errorToString = ex.ToString();

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

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

                // 名前解決(インプロセス)
                ServiceForFx.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;

                // ★★ contextの情報を使用するなどして認証処理をUOCする(必要に応じて)。
                // 持ち回るなら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;

                    // スタックトレースを保って 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ステートレス
                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);
                }
            }
        }
Ejemplo n.º 6
0
        /// <summary>WCF サービス本体</summary>
        /// <param name="param">REST 形式で送信された引数(ParamDataContract)</param>
        /// <returns>REST 形式で送信される戻り値(ReturnDataContract)</returns>
        private ReturnDataContract Call(ParamDataContract param)
        {
            // ステータス
            string status = "-";

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

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

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

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

            #endregion

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

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

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

            #endregion

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

                #region  前解決

                // ★
                status = FxLiteral.SIF_STATUS_NAME_SERVICE;

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

                #endregion

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

                // ★
                status = FxLiteral.SIF_STATUS_DESERIALIZE;

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

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

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

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

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

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

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

                #endregion

                #region 認証処理(UOC)

                // ★
                status = FxLiteral.SIF_STATUS_AUTHENTICATION;

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

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

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

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

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

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

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

                #endregion

                #region B層・D層呼出し

                // ★
                status = FxLiteral.SIF_STATUS_INVOKE;

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

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

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

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

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

                #endregion

                #region 戻り値の文字列化

                // ★
                status = FxLiteral.SIF_STATUS_SERIALIZE;

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

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

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

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

                #endregion

                // ★
                status = "";

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

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

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

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

                errorToString = bsEx.ToString();

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

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

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

                errorToString = fxEx.ToString();

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

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

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

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

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

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

                // 終了ログの出力
                if (status == "")
                {
                    // 終了ログ出力
                    LogIF.InfoLog("SERVICE-IF", "正常終了");
                }
                else
                {
                    // 終了ログ出力
                    LogIF.ErrorLog("SERVICE-IF",
                                   "異常終了"
                                   + ":" + status + "\r\n"
                                   + "エラー タイプ:" + errorType + "\r\n" // 2009/09/15-この行
                                   + "エラー メッセージID:" + errorMessageID + "\r\n"
                                   + "エラー メッセージ:" + errorMessage + "\r\n"
                                   + errorToString + "\r\n");
                }
            }
        }
Ejemplo n.º 7
0
        public string Call(ref string context,
                           string serviceName, string[] cmnParameterValue, string parameterValue, out string 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;

                // 名前解決(インプロセス)
                ServiceForMu.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], // ボタン名
                    cmnParameterValue[2], // メソッド名
                    cmnParameterValue[3], // アクションタイプ
                    new MyUserInfo(context, HttpContext.Current.Request.UserHostAddress));

                // parameterValueを引数の文字列フィールドに設定
                muParameterValue.Value = 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.Value;

                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の場合は、ToStringがデフォ
                //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");
                }
            }
        }