public bool PreExcete(ReaderErrorEventHandler OnReaderError) { CacheRouteMapping mapping; if (!CacheRouteMappingGenrator.TryGetValue(this._type, out mapping)) { if (OnReaderError != null) { OnReaderError(EnumAjaxParams.ReqCode.NotFoundRouteInfo, "未找到路由设置信息"); } return(false); } string routeName = Reader.RouteName.ToLower(); CacheRouteInfo value; if (!mapping.TryGetQueryCache(routeName, out value)) { if (OnReaderError != null) { OnReaderError(EnumAjaxParams.ReqCode.NotFoundCacheAPI, "未找到相匹配的API信息"); } return(false); } if (value.Parameters == null) { value.Parameters = new Dictionary <string, ParameterInfo>(); ParameterInfo[] parameterInfos = value.Method.GetParameters(); foreach (ParameterInfo item in parameterInfos) { value.Parameters.Add(item.Name, item); } mapping.SetQueryCache(routeName, value); } Func <Func <Dictionary <string, object>, ServiceExchangeData> > cacheParamReader = () => { value.ParamReader = CacheRouteMappingGenrator.GetParamReader(OnReaderError, value.ClassType, value.Method, value.Parameters); mapping.SetQueryCache(routeName, value); return(value.ParamReader); }; if (!Reader.ParseMethod() || !Reader.ParseQuery()) { if (OnReaderError != null) { OnReaderError(EnumAjaxParams.ReqCode.MethodOrArgrumentIsNull, "方法和参数未定义"); } return(false); } if (value.ParamReader == null) { cacheParamReader(); } if (value.RouteFlags != RouteFlags.Default && this._Filters.Count > 0) { foreach (var item in this._Filters) { if ((item.RouteFlags & value.RouteFlags) == item.RouteFlags) { var data = new ServiceFilterParam() { RightsName = value.RightsName }; if (!item.Excute(data)) { if (OnReaderError != null) { OnReaderError(EnumAjaxParams.ReqCode.FiltersError, "没有授权访问此方法!" + item.Name); } return(false); } } } } this.RouteValue = value; return(true); }
public static Func <Dictionary <string, object>, ServiceExchangeData> GetParamReader(ReaderErrorEventHandler OnReaderError, Type classType, MethodInfo method, Dictionary <string, ParameterInfo> Parameters) { Func <Dictionary <string, object>, ServiceExchangeData> func = (dic) => { ServiceExchangeData resultData = new ServiceExchangeData() { IsFlow = true, Result = BaseResult.Empty, ResultData = null, Vars = new Dictionary <string, object>(), }; try { object[] parameters = new object[Parameters.Count]; string[] keys = new string[Parameters.Count]; int index = 0; foreach (var item in Parameters) { if (item.Value.ParameterType == typeof(BaseResult)) { parameters[index] = BaseResult.Empty; keys[index] = item.Key; } else if (dic.ContainsKey(item.Key)) { parameters[index] = dic[item.Key]; keys[index] = item.Key; } index++; } object invoker = Activator.CreateInstance(classType); resultData.ResultData = method.Invoke(invoker, parameters); resultData.Vars = new Dictionary <string, object>(); index = 0; foreach (var item in parameters) { if (item == null) { continue; } if (item.GetType() == typeof(BaseResult)) { resultData.Result = (BaseResult)item; } else { resultData.Vars.Add(keys[index], item); } index++; } } catch (Exception ex) { if (OnReaderError != null) { OnReaderError(604, ex.Message); } throw ex; } return(resultData); }; return(func); }