/// <summary>
        /// 用于调用方法的反射方法。有关realproxy,请参阅文档。
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage message)
        {
            // 转换为 MethodCallMessage
            System.Runtime.Remoting.Messaging.IMethodCallMessage methodMessage = new System.Runtime.Remoting.Messaging.MethodCallMessageWrapper((System.Runtime.Remoting.Messaging.IMethodCallMessage)message);

            // 提取正在调用的方法
            System.Reflection.MethodBase method = methodMessage.MethodBase;

            // 执行 call
            object returnValue = null;

            if (method.DeclaringType == typeof(IDynamicProxy))
            {
                // 处理此实例而不是代理目标实例上的IDynamicProxy接口调用
                returnValue = method.Invoke(this, methodMessage.Args);
            }
            else
            {
                // 委托给调用处理程序
                returnValue = invocationHandler(proxyTarget, method, methodMessage.Args);
            }

            // 创建返回消息 (ReturnMessage)
            System.Runtime.Remoting.Messaging.ReturnMessage returnMessage = new System.Runtime.Remoting.Messaging.ReturnMessage(returnValue, methodMessage.Args, methodMessage.ArgCount, methodMessage.LogicalCallContext, methodMessage);
            return(returnMessage);
        }
예제 #2
0
        /// <summary>
        /// The reflective method for invoking methods. See documentation for RealProxy.
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage message)
        {
            // Convert to a MethodCallMessage
            System.Runtime.Remoting.Messaging.IMethodCallMessage methodMessage = new System.Runtime.Remoting.Messaging.MethodCallMessageWrapper((System.Runtime.Remoting.Messaging.IMethodCallMessage)message);

            // Extract the method being called
            System.Reflection.MethodBase method = methodMessage.MethodBase;

            // Perform the call
            object returnValue = null;

            if (method.DeclaringType == typeof(IDynamicProxy))
            {
                // Handle IDynamicProxy interface calls on this instance instead of on the proxy target instance
                returnValue = method.Invoke(this, methodMessage.Args);
            }
            else
            {
                // Delegate to the invocation handler
                returnValue = invocationHandler(proxyTarget, method, methodMessage.Args);
            }

            // Create the return message (ReturnMessage)
            System.Runtime.Remoting.Messaging.ReturnMessage returnMessage = new System.Runtime.Remoting.Messaging.ReturnMessage(returnValue, methodMessage.Args, methodMessage.ArgCount, methodMessage.LogicalCallContext, methodMessage);
            return(returnMessage);
        }
예제 #3
0
        //方法执行的结束
        private void endExecuted(System.Runtime.Remoting.Messaging.IMessage msg, DateTime startTime)
        {
            System.Runtime.Remoting.Messaging.ReturnMessage callMsg = msg as System.Runtime.Remoting.Messaging.ReturnMessage;
            string   methodName  = callMsg.MethodName;
            DateTime endTime     = System.DateTime.Now;
            TimeSpan elapsedTime = endTime.Subtract(startTime);
            string   msg1        = "完成:" + methodName + endTime.ToLongTimeString() + " " + endTime.Millisecond.ToString();

            MB.Util.TraceEx.Write(msg1);

            string msg2 = "方法:" + methodName;

            if (callMsg.ReturnValue != null)
            {
                msg2 += string.Format("返回值为:{0} ", callMsg.ReturnValue.ToString());
            }
            msg2 += "总共花费(毫秒)" + elapsedTime.TotalMilliseconds.ToString();

            MB.Util.TraceEx.Write(msg2);
        }
예제 #4
0
        public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage parameter)
        {
            //可以在这里做拦截
            var msg = parameter as System.Runtime.Remoting.Messaging.IMethodCallMessage;

            try
            {
                var rt    = this.SoapHttpClientProtocol.GetInvoke().Invoke(msg.MethodName, msg.Args)[0];
                var rtmsg = new System.Runtime.Remoting.Messaging.ReturnMessage(rt, null, 0, msg.LogicalCallContext, msg);
                return(rtmsg);
            }
            catch (Exception ex)
            {
                //这里把异常重新包装一下,包含参数和url信息,这个样程序在其全局处理异常的地方,就可以针对这个特定异常类型进行处理,获取到请求参数和url等信息
                //如果不这么处理,那么在程序在其全局异常处理的地方拿不到请求时的关键信息,虽然记录了异常信息,但确实最关键了,不好后续使用相同参数去复现
                //如果在这里直接记录异常信息,也能把参数,url等信息记录到,但是没必要,这里作为类库方,只是把异常信息尽量明确就好,记录日志的逻辑交给调用方去处理
                throw new InvokedException("调用远程webservice接口发生异常", ex)
                      {
                          Url = this.SoapHttpClientProtocol.Url, Action = msg.MethodName, Parameter = msg.Args
                      };
            }
        }
예제 #5
0
        /// <summary>
        /// 方法调用之后。
        /// </summary>
        /// <param name="msg"></param>
        public void EndProcess(DateTime beginExecute, System.Runtime.Remoting.Messaging.IMessage msg)
        {
            System.Runtime.Remoting.Messaging.ReturnMessage callMsg = msg as System.Runtime.Remoting.Messaging.ReturnMessage;

            endExecuted(msg, beginExecute);
        }
        public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage message)
        {
            // Convert to a MethodCallMessage
            System.Runtime.Remoting.Messaging.IMethodCallMessage methodMessage = new System.Runtime.Remoting.Messaging.MethodCallMessageWrapper((System.Runtime.Remoting.Messaging.IMethodCallMessage)message);

            // Extract the method being called
            System.Reflection.MethodBase method = methodMessage.MethodBase;

            // Perform the call
            object returnValue = null;
            if (method.DeclaringType == typeof(IDynamicProxy)) {
                // Handle IDynamicProxy interface calls on this instance instead of on the proxy target instance
                returnValue = method.Invoke(this, methodMessage.Args);
            } else {
                // Delegate to the invocation handler
                returnValue = invocationHandler(proxyTarget, method, methodMessage.Args);
            }

            // Create the return message (ReturnMessage)
            System.Runtime.Remoting.Messaging.ReturnMessage returnMessage = new System.Runtime.Remoting.Messaging.ReturnMessage(returnValue, methodMessage.Args, methodMessage.ArgCount, methodMessage.LogicalCallContext, methodMessage);
            return returnMessage;
        }