public override IMessage Invoke(IMessage msg) { if (msg is IConstructionCallMessage) { IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage; IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg); RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue); Console.WriteLine("Call constructor"); return(constructionReturnMessage); } else { IMethodCallMessage callMsg = msg as IMethodCallMessage; IMessage message; try { Console.WriteLine(callMsg.MethodName + "执行前。。。"); object[] args = callMsg.Args; object o = callMsg.MethodBase.Invoke(GetUnwrappedServer(), args); Console.WriteLine(callMsg.MethodName + "执行后。。。"); message = new ReturnMessage(o, args, args.Length, callMsg.LogicalCallContext, callMsg); } catch (Exception e) { message = new ReturnMessage(e, callMsg); } Console.WriteLine(message.Properties["__Return"]); return(message); } }
internal void FilterConstructors() { if (this._fIsJitActivated) { throw new ServicedComponentException(Resource.FormatString("ServicedComponentException_BadConfiguration")); } this._filterConstructors = true; RealProxy.SetStubData(this, NegativeOne); }
/// <summary> /// 构造函数代理方法执行. /// </summary> /// <param name="methodInvoke">代理目标方法</param> /// <returns>代理结果</returns> public virtual IMessage ProcessConstruct(IMessage methodInvoke) { IConstructionCallMessage constructCallMsg = methodInvoke as IConstructionCallMessage; IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)methodInvoke); RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue); return(constructionReturnMessage); }
public override RealProxy CreateProxy(ObjRef objRef, Type serverType, object serverObject, Context serverContext) { TransparentProxy proxy = new TransparentProxy(serverType); if (serverContext != null) { RealProxy.SetStubData(proxy, serverContext); } return(proxy); }
public IMessage LocalInvoke(IMessage reqMsg) { IMessage message = null; if (reqMsg is IConstructionCallMessage) { this.ActivateProxy(); if (this._filterConstructors) { this._filterConstructors = false; RealProxy.SetStubData(this, this._token); } if (((IConstructionCallMessage)reqMsg).ArgCount > 0) { throw new ServicedComponentException(Resource.FormatString("ServicedComponentException_ConstructorArguments")); } MarshalByRefObject transparentProxy = (MarshalByRefObject)this.GetTransparentProxy(); return(EnterpriseServicesHelper.CreateConstructionReturnMessage((IConstructionCallMessage)reqMsg, transparentProxy)); } if (reqMsg is IMethodCallMessage) { message = this.HandleSpecialMethods(reqMsg); if (message != null) { return(message); } if ((base.GetUnwrappedServer() == null) || (((IntPtr)RealProxy.GetStubData(this)) == NegativeOne)) { throw new ObjectDisposedException("ServicedComponent"); } bool flag = this.SendMethodCall(reqMsg); try { message = RemotingServices.ExecuteMessage((MarshalByRefObject)this.GetTransparentProxy(), (IMethodCallMessage)reqMsg); if (flag) { this.SendMethodReturn(reqMsg, ((IMethodReturnMessage)message).Exception); } } catch (Exception exception) { if ((exception is NullReferenceException) || (exception is SEHException)) { throw; } if (flag) { this.SendMethodReturn(reqMsg, exception); } throw; } } return(message); }
public virtual IMessage ProcessConstruct(IMessage msg) { IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage; //构造函数 初始化 IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg); RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue); //Console.WriteLine("Call constructor:"+constructCallMsg.MethodName); //Console.WriteLine("Call constructor arg count:"+constructCallMsg.ArgCount); return(constructionReturnMessage); }
//调用代理的类型的方法 public override IMessage Invoke(IMessage msg) { //用lock来防止多线程在一个时间同时操作方法 //lock (obj) //{ //} object returnIMessage = null; IMessage message; //如果是调用了构造函数就进入使用下面的代码 if (msg is IConstructionCallMessage) { //构造函数调用 IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage; IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg); RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue); returnIMessage = constructionReturnMessage; } //如果调用方法是一般方法,进入If语句 else { var methodCall = msg as IMethodCallMessage; var methodInfo = methodCall.MethodBase as MethodInfo; //if(_Filter(methodInfo)) // Log("In Dynamic Proxy - Before executing '{0}'", methodCall.MethodName); OnBeforeExecute(methodCall); try { var result = methodInfo.Invoke(GetUnwrappedServer(), methodCall.InArgs); //if (_Filter(methodInfo)) // Log("In Dynamic Proxy - After executing '{0}' ", methodCall.MethodName); message = new ReturnMessage(result, null, 0, methodCall.LogicalCallContext, methodCall); OnAfterExecute(methodCall, message.Properties["__Return"]); returnIMessage = message; } catch (Exception ex) { // if (_Filter(methodInfo)) // Log(string.Format( //"In Dynamic Proxy- Exception {0} executing '{1}'", ex), //methodCall.MethodName); OnErrorExecuting(methodCall, ex.InnerException.ToString()); returnIMessage = new ReturnMessage(ex, methodCall); } } return(returnIMessage as IMessage); }
private void FinalizeHere() { IntPtr currentContextToken = Proxy.GetCurrentContextToken(); IntPtr currentContext = Proxy.GetCurrentContext(); try { RealProxy.SetStubData(this, currentContextToken); ((ServicedComponent)this.GetTransparentProxy())._callFinalize(false); } finally { Marshal.Release(currentContext); RealProxy.SetStubData(this, NegativeOne); } }
public override RealProxy CreateProxy(ObjRef objRef, Type serverType, Object serverObject, Context serverContext) { var proxy = new InterceptionRealProxy(serverType); if (serverContext != null) { RealProxy.SetStubData(proxy, serverContext); } if ((serverType.IsMarshalByRef == false) && (serverContext == null)) { throw new RemotingException("Bad Type for CreateProxy"); } return(proxy); }
public override RealProxy CreateProxy(ObjRef objRef1, Type serverType, object serverObject, Context serverContext) { MyProxy myCustomProxy = new MyProxy(serverType); if (serverContext != null) { RealProxy.SetStubData(myCustomProxy, serverContext); } if ((!serverType.IsMarshalByRef) && (serverContext == null)) { throw new RemotingException("Bad Type for CreateProxy"); } return(myCustomProxy); }
public override IMessage Invoke(IMessage msg) { //消息拦截之后,就会执行这里的方法。 IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage; if (constructCallMsg != null) // 如果是构造函数,按原来的方式返回即可。 { IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg); if (constructionReturnMessage != null) { RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue); return(constructionReturnMessage); } } IMethodCallMessage callMsg = msg as IMethodCallMessage; if (callMsg != null) //如果是方法调用(属性也是方法调用的一种) { object[] args = callMsg.Args; IMessage message; try { if (callMsg.MethodName.StartsWith("set_") && args.Length == 1) { //这里检测到是set方法 //在这里切入日志记录 if (!args[0].GetType().IsByRef || args[0].GetType().MemberType == typeof(string).MemberType) { Logger.WriteInfo(string.Format("加载{0}成功,值:{1}", callMsg.MethodName.Substring(callMsg.MethodName.IndexOf("_", StringComparison.Ordinal) + 1), args[0])); } } object o = callMsg.MethodBase.Invoke(GetUnwrappedServer(), args); message = new ReturnMessage(o, args, args.Length, callMsg.LogicalCallContext, callMsg); } catch (Exception e) { message = new ReturnMessage(e, callMsg); } return(message); } return(msg); }
public override IMessage Invoke(IMessage msg) { if (msg is IConstructionCallMessage) { IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage; IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject(constructCallMsg); RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue); return(constructionReturnMessage); } else if (msg is IMethodCallMessage) { IMethodCallMessage callMsg = msg as IMethodCallMessage; //object[] copiedArgs = Array.CreateInstance(typeof(object), callMsg.Args.Length) as object[]; //callMsg.Args.CopyTo(copiedArgs, 0); var copiedArgs = callMsg.Args; IMessage message; try { var taget = GetUnwrappedServer(); if (taget is IModel) { if (callMsg.MethodName.StartsWith("set_") && copiedArgs.Length == 1) { //透明代理无法调试 //var model = taget as IModel; //if (model.GetInnerChanges()) //{ // model.SetChanges(callMsg.MethodName.Substring(4), copiedArgs[0]); //} } } var returnValue = callMsg.MethodBase.Invoke(taget, copiedArgs); message = new ReturnMessage(returnValue, copiedArgs, copiedArgs.Length, callMsg.LogicalCallContext, callMsg); } catch (Exception e) { message = new ReturnMessage(e, callMsg); } return(message); } return(msg); }
void IManagedPoolAction.LastRelease() { if (this.IsObjectPooled && (base.GetUnwrappedServer() != null)) { this.ReleaseContext(); IntPtr currentContextToken = Proxy.GetCurrentContextToken(); IntPtr currentContext = Proxy.GetCurrentContext(); try { RealProxy.SetStubData(this, currentContextToken); ((ServicedComponent)this.GetTransparentProxy())._callFinalize(!this._fFinalized && !this._fReturnedByFinalizer); GC.SuppressFinalize(this); } finally { Marshal.Release(currentContext); RealProxy.SetStubData(this, this._token); } } }
internal void DeactivateProxy(bool disposing) { if (this._fIsActive) { object transparentProxy = this.GetTransparentProxy(); if (base.GetUnwrappedServer() != null) { this.DispatchDeactivate(); ((ServicedComponent)transparentProxy)._callFinalize(disposing); base.DetachServer(); } RealProxy.SetStubData(this, NegativeOne); this._fIsActive = false; if (!this.IsJitActivated) { this.ReleaseGitCookie(); } this.ReleasePoolUnk(); } }
public override IMessage Invoke(IMessage msg) { if (msg is IConstructionCallMessage) { var constructCallMessage = msg as IConstructionCallMessage; var argMessage = BuildArgMessageString(constructCallMessage, constructCallMessage.Args); Console.WriteLine($"=== Call {constructCallMessage.ActivationType.Name} Constructor Start{argMessage} ==="); var constructReturnMessage = this.InitializeServerObject(constructCallMessage); RealProxy.SetStubData(this, constructReturnMessage.ReturnValue); Console.WriteLine($"=== Call {constructCallMessage.ActivationType.Name} Constructor Finish ==="); return(constructReturnMessage); } var callMessage = msg as IMethodCallMessage; ReturnMessage message; try { var args = callMessage.Args; var argMessage = BuildArgMessageString(callMessage, args); Console.WriteLine($"=== Call {callMessage.MethodName} Start{argMessage} ==="); var output = callMessage.MethodBase.Invoke(GetUnwrappedServer(), args); var returnMessage = BuildReturnMessageString(callMessage, output); Console.WriteLine($"=== Call {callMessage.MethodName} Finish{returnMessage} ==="); message = new ReturnMessage(output, args, args.Length, callMessage.LogicalCallContext, callMessage); } catch (Exception e) { message = new ReturnMessage(e, callMessage); } return(message); }
public override IMessage Invoke(IMessage msg) { b += 1; if (msg is IConstructionCallMessage) { IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage; IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject(constructCallMsg); RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue); return(constructionReturnMessage); } else if (msg is IMethodCallMessage) { IMethodCallMessage callMsg = msg as IMethodCallMessage; object[] copiedArgs = Array.CreateInstance(typeof(object), callMsg.Args.Length) as object[]; callMsg.Args.CopyTo(copiedArgs, 0); //var copiedArgs = callMsg.Args; IMessage message; try { var taget = GetUnwrappedServer(); object returnValue; if (callMsg.MethodName.StartsWith("set_") && copiedArgs.Length == 1) { var method = _serverType.GetMethod("SetChanges", BindingFlags.NonPublic | BindingFlags.Instance); method.Invoke(taget, new object[] { callMsg.MethodName.Substring(4), copiedArgs[0] }); } returnValue = callMsg.MethodBase.Invoke(taget, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static, null, copiedArgs, null); message = new ReturnMessage(returnValue, copiedArgs, copiedArgs.Length, callMsg.LogicalCallContext, callMsg); } catch (Exception e) { message = new ReturnMessage(e, callMsg); } return(message); } return(msg); }
private void SetupContext(bool construction) { IntPtr currentContextToken = Proxy.GetCurrentContextToken(); if (this._token != currentContextToken) { if (this._token != NegativeOne) { this.ReleaseContext(); } this._token = currentContextToken; this._context = Proxy.GetCurrentContext(); this._tracker = Proxy.FindTracker(this._context); } if (!this._filterConstructors) { RealProxy.SetStubData(this, this._token); } if ((this.IsJitActivated && !this._tabled) && !construction) { IdentityTable.AddObject(this._token, this.GetTransparentProxy()); this._tabled = true; } }
public override IMessage Invoke(IMessage msg) { Logger log = null; string returnvalue = null;//返回值 bool IsErrorMsg = false; if (IsErrorLog || IsAllLog) { log = new Logger { CreateDate = DateTime.Now, Project = "SesameLingo", LogType = (int)LogType.Warring, Args = "" }; } object returnIMessage = null; if (msg is IConstructionCallMessage) { //构造函数调用 IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage; IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg); RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue); // Console.WriteLine("Call constructor"); object[] args = constructCallMsg.Args; for (int i = 0; i < args.Length; i++) { log.Args += (args[i] != null ? args[i].ToString() : "") + ","; } returnIMessage = constructionReturnMessage; } else { //非构造函数调用 IMethodCallMessage callMsg = msg as IMethodCallMessage; IMessage message; try { log.MethodName = callMsg.MethodName; log.TypeName = callMsg.TypeName; object[] args = callMsg.Args; object o = callMsg.MethodBase.Invoke(GetUnwrappedServer(), args); message = new ReturnMessage(o, args, args.Length, callMsg.LogicalCallContext, callMsg); #region 记录方法输入参数 if (args != null && args.Length > 0) { for (int i = 0; i < args.Length; i++) { log.Args += (args[i] != null ? args[i].ToString() : "") + ","; } } #endregion } catch (Exception ex) { message = new ReturnMessage(ex, callMsg); IsErrorMsg = true; if (IsErrorLog || IsAllLog) { log.ErrorMsg = Newtonsoft.Json.JsonConvert.SerializeObject(ex); log.LogType = (int)LogType.Error; } } if (message.Properties["__Return"] != null) { returnvalue = message.Properties["__Return"].ToString(); } log.ReturnValue = returnvalue; //Console.WriteLine(returnvalue); returnIMessage = message; } if (IsAllLog) { log.EndDate = DateTime.Now; TimeSpan span = (TimeSpan)(log.EndDate - log.CreateDate); log.UseTime = span.Milliseconds; if (span.Milliseconds > SlowQuery) { Task task = new Task(new Action(() => { SystemErrorLogOper.Create(log); })); task.Start(); } } else if (IsErrorLog && IsErrorMsg) { log.EndDate = DateTime.Now; TimeSpan span = (TimeSpan)(log.EndDate - log.CreateDate); log.UseTime = span.Milliseconds; Task task = new Task(new Action(() => { SystemErrorLogOper.Create(log); })); task.Start(); } return(returnIMessage as IMessage); }
public override IMessage Invoke(IMessage msg) { //方法启动时间 DateTime startTime = DateTime.Now; //记录方法返回结果 string returnvalue = "null"; Log log = new Log(); //log.Uri = msg.Properties["__Uri"].ToString(); log.IP = ""; log.Mac = ""; log.MethodName = msg.Properties["__MethodName"].ToString(); log.MethodSignature = msg.Properties["__MethodSignature"].ToString(); log.TypeName = msg.Properties["__TypeName"].ToString(); log.CallContext = msg.Properties["__CallContext"].ToString(); log.Project = "AOPTestClient"; object returnIMessage = null; if (msg is IConstructionCallMessage) { //构造函数调用 IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage; IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg); RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue); //记录方法输入参数 object[] args = constructCallMsg.Args; for (int i = 0; i < args.Length; i++) { log.Args += args[i].ToString() + ","; } returnIMessage = constructionReturnMessage; } else { //非构造函数调用 IMethodCallMessage callMsg = msg as IMethodCallMessage; IMessage message; try { object[] args = callMsg.Args; object o = callMsg.MethodBase.Invoke(GetUnwrappedServer(), args); message = new ReturnMessage(o, args, args.Length, callMsg.LogicalCallContext, callMsg); //记录方法输入参数 for (int i = 0; i < args.Length; i++) { log.Args += args[i].ToString() + ","; } } catch (Exception e) { message = new ReturnMessage(e, callMsg); returnvalue = e.InnerException.ToString(); } if (message.Properties["__Return"] != null) { returnvalue = message.Properties["__Return"].ToString(); } log.ReturnValue = returnvalue; Console.WriteLine(returnvalue); returnIMessage = message; } //方法结束时间 DateTime endTime = DateTime.Now; log.UseTime = (endTime - startTime).ToString(); //写入日志到数据库 SysLogService.GetInstance().InsertAccessLog(log); return(returnIMessage as IMessage); }
public override IMessage Invoke(IMessage msg) { DateTime startTime = DateTime.Now;//方法启动时间 //记录方法返回结果 string returnvalue = "null"; //Model.sys_AccessLog log = new Model.sys_AccessLog(); ////log.Uri = msg.Properties["__Uri"].ToString(); //log.IP = Safe.Instance().ClientIp(); //log.Mac = Safe.Instance().ClientPort(); //log.MethodName = msg.Properties["__MethodName"].ToString(); //log.MethodSignature = msg.Properties["__MethodSignature"].ToString(); //log.TypeName = msg.Properties["__TypeName"].ToString(); //log.CallContext = msg.Properties["__CallContext"].ToString(); //log.Project = "XAUTOA"; object returnIMessage = null; if (msg is IConstructionCallMessage) { //构造函数调用 IConstructionCallMessage constructCallMsg = msg as IConstructionCallMessage; IConstructionReturnMessage constructionReturnMessage = this.InitializeServerObject((IConstructionCallMessage)msg); RealProxy.SetStubData(this, constructionReturnMessage.ReturnValue); //Console.WriteLine("Call constructor"); object[] args = constructCallMsg.Args; for (int i = 0; i < args.Length; i++) { log.Debug("__Args:" + args[i].ToString()); } returnIMessage = constructionReturnMessage; } else { log.Debug("__MethodName:" + msg.Properties["__MethodName"].ToString()); log.Debug("__MethodSignature:" + msg.Properties["__MethodSignature"].ToString()); log.Debug("__TypeName:" + msg.Properties["__TypeName"].ToString()); log.Debug("__CallContext:" + msg.Properties["__CallContext"].ToString()); //非构造函数调用 IMethodCallMessage callMsg = msg as IMethodCallMessage; IMessage message; CarPartsEntities db = new CarPartsEntities(); DbConnection con = null; DbTransaction tran = null; try { object[] args = callMsg.Args; #region 记录方法输入参数 //log.IP = args[args.Length-2].ToString(); //log.Mac = args[args.Length - 1].ToString(); for (int i = 0; i < args.Length; i++) { if (args[i] != null) { log.Debug("__Args:" + args[i].ToString()); } } #endregion //BaseBusiness bb = (BaseBusiness)GetUnwrappedServer(); BaseBusiness bb = new BaseBusiness(); bb.db = db; //打开数据库连接 con = ((IObjectContextAdapter)db).ObjectContext.Connection; con.Open(); //开启事务 tran = con.BeginTransaction(); object o = callMsg.MethodBase.Invoke(GetUnwrappedServer(), args); message = new ReturnMessage(o, args, args.Length, callMsg.LogicalCallContext, callMsg); //业务逻辑处理完毕,提交事务 db.SaveChanges(); tran.Commit(); } catch (Exception e) { //发生异常,事务回滚 tran.Rollback(); message = new ReturnMessage(e, callMsg); returnvalue = e.InnerException.ToString(); } finally { //关闭数据库连接 con.Close(); } if (message.Properties["__Return"] != null) { returnvalue = message.Properties["__Return"].ToString(); } log.Info("__ReturnValue:" + returnvalue); //Console.WriteLine(returnvalue); returnIMessage = message; } DateTime endTime = DateTime.Now;//方法结束时间 log.Debug("__UseTime:" + (endTime - startTime).ToString()); //SysLogService.GetInstance().InsertAccessLog(log);//写入日志到数据库 log.Debug(string.Format("{0}:{1}", msg.Properties["__MethodName"].ToString(), returnvalue));//写入日志到本地文件 return(returnIMessage as IMessage); }