コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        /// <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;
                    }
                }
            }
        }