/// <summary> /// 调用接口(结果) /// </summary> /// <param name="context"></param> /// <param name="SvrID"></param> /// <param name="method"></param> /// <returns></returns> internal static object GetHttpResult(HttpContext context, string SvrID, string method) { ErrorResponse result; try { var path = Directory.GetParent("wwwroot" + context.Request.Path.ToString().Replace(".assx", ".json")).ToString(); if (!File.Exists(path)) { result = CreateFailResult2("服务未定义" + SvrID); } else { ServiceDefine serviceDefine = ServiceDefineCache.GetServiceDefineByPath(path); Type intf = ServiceDefineCache.GetTypeByPath(path); if (intf != null) { return(GetServiceResult(context, intf, serviceDefine, method)); } else { result = CreateFailResult2("未找到接口定义" + serviceDefine.IntfName + " ;"); } } } catch (ServiceException ex) { result = CreateFailResult2(ex.code, ex.msg); } catch (Exception ex) { result = CreateFailResult2(ex.Message + ex.InnerException?.Message != null ? ex.InnerException.Message.ToString() : ""); } return(result); }
/// <summary> /// 通过路径找指定接口类型 /// </summary> /// <param name="path"></param> /// <returns></returns> internal static ServiceDefine GetServiceDefineByPath(string path) { if (serviceCache.ContainsKey(path)) { return(serviceCache[path]); } string jstr = File.ReadAllText(path); ServiceDefine serviceDefine = JsonConvert.DeserializeObject <ServiceDefine>(jstr); serviceCache[path] = serviceDefine; return(serviceDefine); }
/// <summary> /// 通过路径找指定接口类型 /// </summary> /// <param name="path"></param> /// <returns></returns> internal static Type GetTypeByPath(string path) { if (typeCache.ContainsKey(path)) { return(typeCache[path]); } ServiceDefine serviceDefine = GetServiceDefineByPath(path); if (serviceDefine == null) { return(null); } Type type = ServiceManager.GetTypeFromAssembly(serviceDefine.IntfName, Assembly.Load(serviceDefine.IntfAssembly)); typeCache[path] = type; return(type); }
/// <summary> /// 调用接口(restful封装) /// </summary> /// <param name="context"></param> /// <param name="SvrID"></param> /// <param name="method"></param> /// <returns></returns> internal static Result GetRestfulHttpResult(HttpContext context, string SvrID, string method) { Result result; try { var path = Directory.GetParent("wwwroot" + context.Request.Path.ToString().Replace(".rsfs", ".json")).ToString(); if (!File.Exists(path)) { result = CreateFailResult("服务未定义" + SvrID); } else { ServiceDefine serviceDefine = ServiceDefineCache.GetServiceDefineByPath(path); Type intf = ServiceDefineCache.GetTypeByPath(path); if (intf != null) { result = new Result { data = GetServiceResult(context, intf, serviceDefine, method), code = (int)TYPE_OF_RESULT_TYPE.success, msg = "Success" }; } else { result = CreateFailResult("未找到接口定义" + serviceDefine.IntfName + " ;"); } } } catch (ServiceException ex) { result = CreateFailResult(ex.code, ex.msg); } catch (Exception ex) { result = CreateFailResult(ex.Message + ex.InnerException?.Message != null ? ex.InnerException.Message.ToString() : ""); } return(result); }
/// <summary> /// 调用接口(restful封装) /// </summary> /// <param name="context"></param> /// <param name="SvrID"></param> /// <param name="method"></param> /// <returns></returns> internal static Result GetRestfulHttpResult(HttpContext context, string SvrID, string method) { Result result = CreateFailResult(""); try { var path = Directory.GetParent("wwwroot" + context.Request.Path.ToString().Replace(".rsfs", ".json")).ToString(); if (!File.Exists(path)) { result = CreateFailResult("服务未定义" + SvrID); } else { string jstr = File.ReadAllText(path); ServiceDefine serviceDefine = JsonConvert.DeserializeObject <ServiceDefine>(jstr); Type intf = ServiceManager.GetTypeFromAssembly(serviceDefine.IntfName, Assembly.Load(serviceDefine.IntfAssembly)); if (intf != null) { result.data = GetServiceResult(context, intf, serviceDefine, method); result.code = (int)TYPE_OF_RESULT_TYPE.success; result.msg = "Success"; } else { result = CreateFailResult("未找到接口定义" + serviceDefine.IntfName + " ;"); } } } catch (ServiceException ex) { result = CreateFailResult(ex.code, ex.msg); } catch (Exception ex) { result = CreateFailResult(ex.Message + ex.InnerException?.Message != null ? ex.InnerException.Message.ToString() : ""); } return(result); }
/// <summary> /// 反射调用方法获取执行结果 /// </summary> /// <param name="context"></param> /// <param name="intf"></param> /// <param name="serviceDefine"></param> /// <param name="method"></param> /// <returns></returns> private static object GetServiceResult(HttpContext context, Type intf, ServiceDefine serviceDefine, string method) { var map = GetPara(context); IFormCollection values = null; try { values = context.Request.HttpContext.Request.Form; } catch { } object obj = ServiceManager.GetService(serviceDefine.SvrID, intf); if (obj == null) { throw new ServiceException((int)TYPE_OF_RESULT_TYPE.failure, "服务未定义" + serviceDefine.SvrID); } MethodInfo realmethod = intf.GetMethod(method); if (realmethod == null) { foreach (Type type in intf.GetInterfaces()) { realmethod = type.GetMethod(method); if (realmethod != null) { break; } } } if (realmethod == null) { throw new ServiceException((int)TYPE_OF_RESULT_TYPE.failure, "未找到方法" + method); } else { if (realmethod.GetCustomAttribute(typeof(PublishMethodAttribute)) == null) { throw new ServiceException((int)TYPE_OF_RESULT_TYPE.failure, "服务未发布"); } else { if (realmethod.GetCustomAttribute(typeof(CheckLoginAttribute)) != null) { string token = context.Request.Query["token"].ToString(); if (string.IsNullOrEmpty(token)) { try { token = context.Request.Form["token"]; } catch { } } ICheckLoginMgeSvr checkLoginMgeSvr = (ICheckLoginMgeSvr)ServiceManager.GetService(typeof(ICheckLoginMgeSvr)); if (checkLoginMgeSvr == null) { throw new ServiceException((int)TYPE_OF_RESULT_TYPE.failure, "服务ICheckLoginMgeSvr未实现或未添加"); } if (!checkLoginMgeSvr.CheckLogin(token)) { throw new ServiceException((int)TYPE_OF_RESULT_TYPE.offline, "用户未登录"); } } ParameterInfo[] infos = realmethod.GetParameters(); object[] objs = new object[infos.Length]; for (int i = 0; i < infos.Length; i++) { if (map != null && map.ContainsKey(infos[i].Name)) { objs[i] = ChangeValueToType(map[infos[i].Name], infos[i].ParameterType); } else if (infos[i].ParameterType == typeof(IFormFile)) { if (values.Files.Count > 0) { objs[i] = values.Files[0]; } else { throw new ServiceException((int)TYPE_OF_RESULT_TYPE.failure, $"参数{infos[i]}未找到"); } } else if (infos[i].ParameterType == typeof(IFormCollection)) { if (values.Files.Count > 0) { objs[i] = values.Files; } else { throw new ServiceException((int)TYPE_OF_RESULT_TYPE.failure, $"参数{infos[i]}未找到"); } } else { var items = context.Request.Query[infos[i].Name]; if (items.Count == 0) { try { items = context.Request.Form[infos[i].Name]; } catch { } } if (!infos[i].HasDefaultValue) { if (items.Count == 0) { throw new ServiceException((int)TYPE_OF_RESULT_TYPE.failure, $"参数{infos[i]}未找到"); } else { objs[i] = ChangeValueToType(items[0].ToString(), infos[i].ParameterType); } } else { if (items.Count == 0) { objs[i] = infos[i].DefaultValue; } else { objs[i] = ChangeValueToType(items[0].ToString(), infos[i].ParameterType); } } } } AutoLogAttribute logconfig = realmethod.GetCustomAttribute(typeof(AutoLogAttribute)) as AutoLogAttribute; if (logconfig != null && (logconfig.Level == "INFO" || logconfig.Level == "ALL")) { try { logger.Info($"Source:{Utils.GetIPAddr()},Path:{context.Request.Path},Para:{JsonConvert.SerializeObject(objs)}"); } catch { } } try { object res = realmethod.Invoke(obj, objs); return(res); } catch (Exception ex) { if (logconfig != null && (logconfig.Level == "ERROR" || logconfig.Level == "ALL")) { logger.Error(ex); } throw ex; } } } }