예제 #1
0
        /// <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++;
            }
        }
예제 #2
0
        /// <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");
        }