Пример #1
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;
            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;

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

                // ★★ コンテキストの情報を使用するなどして
                //       認証処理を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ステートレス
                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");
                }
            }
        }
Пример #2
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
            }
        }