/// <summary> /// 调用方法 /// </summary> /// <param name="args"></param> public void Call(CallEventArgs args) { //计数按方法 var thisKey = string.Format("{0}${1}${2}${3}", args.Caller.AppName, args.Caller.ServiceName, args.Caller.MethodName, args.Caller.Parameters); var callKey = IoCHelper.GetMD5String(thisKey); lock (hashtable.SyncRoot) { if (!hashtable.ContainsKey(callKey)) { var counterInfo = new CounterInfo { AppName = args.Caller.AppName, ServiceName = args.Caller.ServiceName, MethodName = args.Caller.MethodName, Parameters = args.Caller.Parameters, NeedReset = false, Count = 1 }; hashtable[callKey] = counterInfo; return; } } var counter = hashtable[callKey] as CounterInfo; if (counter.NeedReset) { //重置计数器 hashtable.Remove(callKey); //如果调用次数超过最大允许数,则提示警告 if (counter.Count >= maxCount) { var warning = new WarningException(string.Format("【{0}】 One minute call service ({1}, {2}) {3} times more than {4} times.\r\nParameters => {5}", counter.AppName, counter.ServiceName, counter.MethodName, counter.Count, maxCount, counter.Parameters)); //内部异常 var error = new IoCException(string.Format("【{0}】 One minute call service ({1}) {2} times.", counter.AppName, counter.ServiceName, counter.Count), warning); //抛出异常 args.Error = error; } } else { //计数器加1 counter.Count++; } }
/// <summary> /// 调用服务,并返回字符串 /// </summary> /// <param name="name"></param> /// <param name="parameters"></param> /// <returns></returns> public string CallMethod(string name, string parameters) { if (callers.ContainsKey(name)) { var caller = callers[name]; var message = new InvokeMessage { ServiceName = caller.Service.FullName, MethodName = caller.Method.ToString(), Parameters = parameters }; string thisKey = string.Format("{0}${1}${2}", message.ServiceName, message.MethodName, message.Parameters); var cacheKey = string.Format("HttpServiceCaller_{0}", IoCHelper.GetMD5String(thisKey)); var invokeData = CacheHelper.Get <InvokeData>(cacheKey); if (invokeData == null) { //获取当前调用者信息 var appCaller = new AppCaller { AppPath = AppDomain.CurrentDomain.BaseDirectory, AppName = "HttpServer", HostName = DnsHelper.GetHostName(), IPAddress = DnsHelper.GetIPAddress(), ServiceName = message.ServiceName, MethodName = message.MethodName, Parameters = message.Parameters, CallTime = DateTime.Now }; //创建服务 var service = CreateService(appCaller); //初始化上下文 SetOperationContext(appCaller); try { //使用Invoke方式调用 var invoke = new InvokeCaller(appCaller.AppName, service); invokeData = invoke.CallMethod(message); //插入缓存 if (invokeData != null && caller.CacheTime > 0) { CacheHelper.Insert(cacheKey, invokeData, caller.CacheTime); } } finally { //初始化上下文 OperationContext.Current = null; } } //如果缓存不为null,则返回缓存数据 if (invokeData != null) { return(invokeData.Value); } } return("null"); }