예제 #1
0
        public override IMessage Invoke(IMessage msg)
        {
            IMethodCallMessage       call   = msg as IMethodCallMessage;
            IConstructionCallMessage ctor   = msg as IConstructionCallMessage;
            IMethodReturnMessage     result = null;

            if (ctor != null)               // 呼び出し関数がコンストラクタの場合

            {
                _behavior.PreInitializer(ctor);

                RealProxy rp = RemotingServices.GetRealProxy(_target);
                rp.InitializeServerObject(ctor);
                MarshalByRefObject tp = this.GetTransparentProxy() as MarshalByRefObject;
                result = EnterpriseServicesHelper.CreateConstructionReturnMessage(ctor, tp);

                _behavior.PostInitializer(ctor);
            }
            else if (call != null)                 // 通常関数の場合

            {
                _behavior.PreCallMethod(call);

                result = RemotingServices.ExecuteMessage(this._target, call);

                _behavior.PostCallMethod(call);
            }
            else
            {
                Console.WriteLine($"メソッドの実行に失敗しました:{msg}");
                //throw new Exception($"メソッドの実行に失敗しました:{msg}");
            }

            return(result);
        }
예제 #2
0
        /// <summary>
        ///  処理を実行します。
        /// </summary>
        /// <param name="msg">呼び出し元を表すメッセージです。</param>
        /// <returns>戻り値を表すメッセージです。</returns>
        public override IMessage Invoke(IMessage msg)
        {
            IMessage result = null;

            if (msg is IConstructionCallMessage ctor)               // コンストラクタの場合
            // 特殊な処理
            {
                _behavior.PreInitializer(_serverType, ctor);

                // コンストラクタ呼び出し
                var rp = RemotingServices.GetRealProxy(_target);
                rp.InitializeServerObject(ctor);
                var tp = this.GetTransparentProxy() as MarshalByRefObject;
                result = EnterpriseServicesHelper.CreateConstructionReturnMessage(ctor, tp);

                // 特殊な処理
                _behavior.PostInitializer(_serverType, ctor);
            }
            else if (msg is IMethodCallMessage func)                 // 通常関数の場合
            // 特殊な処理
            {
                _behavior.PreCallMethod(_serverType, func);

                // 通常関数呼び出し
                result = RemotingServices.ExecuteMessage(_target, func);

                // 特殊な処理
                _behavior.PostCallMethod(_serverType, func);
            }
            else
            {
                // 呼び出しが不正
                result = _behavior.HandleInvalidCall(_serverType, msg);
            }

            return(result);
        }