/// <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); }
/// <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); }
//方法执行的结束 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); }
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 }; } }
/// <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; }