/// <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);
        }
Exemple #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);
        }
Exemple #3
0
        /// <summary>
        /// Filters out the sender.
        /// </summary>
        /// <param name="cachedReceiverList">List of all potential recipients.</param>
        /// <param name="iMessage">The message being sent.</param>
        /// <returns>List of all recipients being called.</returns>
        public object[] GetReceivers(object[] cachedReceiverList, System.Runtime.Remoting.Messaging.IMessage iMessage)
        {
            object[] resultList         = new object[cachedReceiverList.Length];
            int      resultListPosition = 0;

            // by all receivers
            for (int i = 0; i < cachedReceiverList.Length; i++)
            {
                // get ReceiverInfo instance
                ReceiverInfo receiverInfo = cachedReceiverList[i] as ReceiverInfo;
                if (receiverInfo == null)
                {
                    continue;
                }

                // fetch the session
                ISessionSupport session = (ISessionSupport)receiverInfo.Tag;

                // and check on the call condition
                if ((string)session["UserId"] != this._userId)
                {
                    resultList[resultListPosition++] = receiverInfo;
                }
            }

            return(resultList);
        }
Exemple #4
0
        //logging funtion
        public void doLog(System.Runtime.Remoting.Messaging.IMessage msg)
        {
            StreamWriter sw = new StreamWriter(fileName, true);

            System.Collections.IDictionary dict = msg.Properties;
            foreach (string key in dict.Keys)
            {
                sw.WriteLine("Key: " + key + "; Value : " + dict[key]);
            }
            sw.WriteLine("-------------------------------------------");
            sw.Close();
        }
        System.Runtime.Remoting.Messaging.IMessage DoInvoke(System.Runtime.Remoting.Messaging.IMessage inputMessage)
        {
            var inmsg = (System.Runtime.Remoting.Messaging.IMethodCallMessage)inputMessage;
            var od    = channel.Contract.Operations.FirstOrDefault(o => inmsg.MethodBase.Equals(o.SyncMethod) || inmsg.MethodBase.Equals(o.BeginMethod) || inmsg.MethodBase.Equals(o.EndMethod));

            if (od == null)
            {
                var ret = inmsg.MethodBase.Invoke(channel, inmsg.InArgs);
                return(new System.Runtime.Remoting.Messaging.ReturnMessage(ret, null, 0, null, inmsg));
            }
            else
            {
                object[] pl;
                System.Reflection.MethodBase method = null;
                List <object> outArgs = null;
                object        ret;
                if (inmsg.MethodBase.Equals(od.SyncMethod))
                {
                    pl = new object[inmsg.MethodBase.GetParameters().Length];
                    Array.Copy(inmsg.Args, pl, inmsg.ArgCount);
                    ret    = channel.Process(inmsg.MethodBase, od.Name, pl, System.ServiceModel.OperationContext.Current);
                    method = od.SyncMethod;
                }
                else if (inmsg.MethodBase.Equals(od.BeginMethod))
                {
                    pl = new object[inmsg.ArgCount - 2];
                    Array.Copy(inmsg.Args, 0, pl, 0, pl.Length);
                    ret = channel.BeginProcess(inmsg.MethodBase, od.Name, pl, (AsyncCallback)inmsg.Args[inmsg.ArgCount - 2], inmsg.Args[inmsg.ArgCount - 1]);
                    saved_params[ret] = pl;
                    wait.Set();
                }
                else
                {
                    var result = (IAsyncResult)inmsg.InArgs[0];
                    wait.WaitOne();
                    pl = saved_params[result];
                    wait.Reset();
                    saved_params.Remove(result);
                    ret    = channel.EndProcess(inmsg.MethodBase, od.Name, pl, result);
                    method = od.BeginMethod;
                }
                if (method != null && method.GetParameters().Any(pi => pi.IsOut || pi.ParameterType.IsByRef))
                {
                    return(new System.Runtime.Remoting.Messaging.ReturnMessage(ret, pl, pl.Length, null, inmsg));
                }
                else
                {
                    return(new System.Runtime.Remoting.Messaging.ReturnMessage(ret, outArgs != null ? outArgs.ToArray() : null, outArgs != null ? outArgs.Count : 0, null, inmsg));
                }
            }
        }
 public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage inputMessage)
 {
     try
     {
         return(DoInvoke(inputMessage));
     }
     catch (System.Reflection.TargetInvocationException ex)
     {
         if (ex.InnerException != null)
         {
             throw ex.InnerException;
         }
         throw;
     }
 }
Exemple #7
0
        /// <summary>
        /// 方法异常处理
        /// </summary>
        /// <param name="requestMsg"></param>
        /// <param name="ex"></param>
        public override void OnException(System.Runtime.Remoting.Messaging.IMessage requestMsg, Exception ex)
        {
            var msg = requestMsg as System.Runtime.Remoting.Messaging.IMethodCallMessage;

            #region 异常
            AopLogAttribute logAttr = null;
            var             attrs   = msg.MethodBase.GetCustomAttributes(typeof(AopLogAttribute), false);
            if (attrs.Length > 0)
            {
                logAttr = attrs[0] as AopLogAttribute;
            }
            using (var business = new BusinessLog())
            {
                business.LogException(msg, logAttr, ex);
            }
            #endregion
        }
Exemple #8
0
    public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage msg)
    {
        var methodCall = msg as IMethodCallMessage;
        var methodInfo = methodCall.MethodBase as MethodInfo;

        Console.WriteLine("Before " + methodInfo.Name);
        try
        {
            var result = methodInfo.Invoke(_realInstace, methodCall.InArgs);
            Console.WriteLine("After " + methodInfo.Name);
            return(new ReturnMessage(result, null, 0,
                                     methodCall.LogicalCallContext, methodCall));
        }
        catch (Exception e)
        {
            return(new ReturnMessage(e, methodCall));
        }
    }
Exemple #9
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);
        }
Exemple #10
0
        /// <summary>
        /// 方法执行前处理
        /// </summary>
        /// <param name="requestMsg"></param>
        public override void Invoking(System.Runtime.Remoting.Messaging.IMessage requestMsg)
        {
            var msg = requestMsg as System.Runtime.Remoting.Messaging.IMethodCallMessage;

            #region log
            AopLogAttribute logAttr = null;
            var             attrs   = msg.MethodBase.GetCustomAttributes(typeof(AopLogAttribute), false);
            if (attrs.Length > 0)
            {
                logAttr = attrs[0] as AopLogAttribute;
            }
            if (logAttr != null)
            {
                using (var business = new BusinessLog())
                {
                    business.LogBusiness(msg, logAttr);
                }
            }
            #endregion
        }
Exemple #11
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
                      };
            }
        }
 public System.Runtime.Remoting.Messaging.IMessageCtrl AsyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Messaging.IMessageSink replySink)
 {
     throw null;
 }
 public System.Runtime.Remoting.Channels.ServerProcessing ProcessMessage(System.Runtime.Remoting.Channels.IServerChannelSinkStack sinkStack, System.Runtime.Remoting.Messaging.IMessage requestMsg, System.Runtime.Remoting.Channels.ITransportHeaders requestHeaders, System.IO.Stream requestStream, out System.Runtime.Remoting.Messaging.IMessage responseMsg, out System.Runtime.Remoting.Channels.ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
 {
     throw null;
 }
 public System.IO.Stream GetResponseStream(System.Runtime.Remoting.Channels.IServerResponseChannelSinkStack sinkStack, object state, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers)
 {
     throw null;
 }
 public void AsyncProcessResponse(System.Runtime.Remoting.Channels.IServerResponseChannelSinkStack sinkStack, object state, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers, System.IO.Stream stream)
 {
 }
 public System.Runtime.Remoting.Messaging.IMessage SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage msg)
 {
     throw null;
 }
Exemple #17
0
 /// <summary>
 /// 业务日志记录
 /// </summary>
 /// <param name="msg"></param>
 /// <param name="logAttr"></param>
 public void LogBusiness(System.Runtime.Remoting.Messaging.IMessage msg, AopLogAttribute logAttr)
 {
     //TODO 业务日志记录
 }
Exemple #18
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 virtual void DispatchReplyMessage(System.Runtime.Remoting.Messaging.IMessage msg)
 {
 }
Exemple #20
0
 /// <summary>
 /// 异常记录
 /// </summary>
 /// <param name="msg"></param>
 /// <param name="logAttr"></param>
 /// <param name="ex"></param>
 public void LogException(System.Runtime.Remoting.Messaging.IMessage msg, AopLogAttribute logAttr, Exception ex)
 {
     //TODO 异常记录
 }
 public abstract System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage msg);
Exemple #22
0
 public virtual void AsyncProcessResponse(System.Runtime.Remoting.Messaging.IMessage msg, ITransportHeaders headers, System.IO.Stream stream)
 {
 }
Exemple #23
0
 System.Runtime.Remoting.Messaging.IMessage System.Runtime.Remoting.Messaging.IMessageSink.SyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage msg)
 {
     (System.Threading.Thread.CurrentContext.GetProperty("ok ok") as MyContextProperty).doLog(msg);
     return(next.SyncProcessMessage(msg));
 }
Exemple #24
0
 // Methods
 System.Runtime.Remoting.Messaging.IMessageCtrl System.Runtime.Remoting.Messaging.IMessageSink.AsyncProcessMessage(System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Messaging.IMessageSink replySink)
 {
     (System.Threading.Thread.CurrentContext.GetProperty("ok ok") as MyContextProperty).doLog(msg);
     return(next.AsyncProcessMessage(msg, replySink));
 }
 public void AsyncProcessRequest(System.Runtime.Remoting.Channels.IClientChannelSinkStack sinkStack, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers, System.IO.Stream stream)
 {
 }
 public System.IO.Stream GetRequestStream(System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers)
 {
     throw null;
 }
Exemple #27
0
 /// <summary>
 /// 方法调用之前。
 /// </summary>
 /// <param name="msg"></param>
 public void BeginProcess(System.Runtime.Remoting.Messaging.IMessage msg)
 {
     System.Runtime.Remoting.Messaging.IMethodCallMessage callMsg = msg as System.Runtime.Remoting.Messaging.IMethodCallMessage;
     beginExecuting(callMsg.MethodName, callMsg);
 }
 public void ProcessMessage(System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders requestHeaders, System.IO.Stream requestStream, out System.Runtime.Remoting.Channels.ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
 {
     throw null;
 }
Exemple #29
0
 public virtual System.IO.Stream GetResponseStream(System.Runtime.Remoting.Messaging.IMessage msg, ITransportHeaders headers)
 {
 }
Exemple #30
0
 public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage msg)
 {
 }