public void Register(IBusinessPool businessPool)
        {
            pool = businessPool;
            //读取配置文件
            try
            {
                BusinessKindModel   kindModel   = null;
                BusinessMethodModel methodModel = null;

                var container = new WindsorContainer();
                if (ConfigurationManager.GetSection("mysoft.framework/restful") != null)
                {
                    container = new WindsorContainer(new XmlInterpreter(new ConfigResource("mysoft.framework/restful")));
                }

                //给当前容器赋值
                this.container = new ServiceContainer(container);

                foreach (var type in GetInterfaceServices <PublishKindAttribute>(container))
                {
                    //获取类特性
                    var kind = CoreHelper.GetTypeAttribute <PublishKindAttribute>(type);
                    if (kind == null)
                    {
                        continue;
                    }

                    kind.Name = kind.Name.ToLower();

                    //如果包含了相同的类别,则继续
                    if (pool.KindMethods.ContainsKey(kind.Name))
                    {
                        kindModel = pool.KindMethods[kind.Name];
                    }
                    else
                    {
                        kindModel = new BusinessKindModel
                        {
                            Name        = kind.Name,
                            Description = kind.Description
                        };

                        pool.AddKindModel(kind.Name, kindModel);
                    }

                    //获取方法特性
                    foreach (MethodInfo info in CoreHelper.GetMethodsFromType(type))
                    {
                        var method = CoreHelper.GetMemberAttribute <PublishMethodAttribute>(info);
                        if (method != null)
                        {
                            method.Name = method.Name.ToLower();

                            //如果包含了相同的方法,则继续
                            if (kindModel.MethodModels.ContainsKey(method.Name))
                            {
                                //处理重复的方法
                                for (int i = 0; i < 10000; i++)
                                {
                                    var name = method.Name + (i + 1);
                                    if (!kindModel.MethodModels.ContainsKey(name))
                                    {
                                        method.Name = name;
                                        break;
                                    }
                                }
                            }

                            methodModel = new BusinessMethodModel
                            {
                                Name            = method.Name,
                                Description     = method.Description,
                                HttpMethod      = HttpMethod.GET,
                                Authorized      = method.Authorized,
                                Method          = info,
                                Parameters      = info.GetParameters(),
                                ParametersCount = info.GetParameters().Count(),
                                Service         = type
                            };

                            var types = info.GetParameters().Select(p => p.ParameterType).ToArray();
                            if (!CoreHelper.CheckPrimitiveType(types))
                            {
                                methodModel.HttpMethod = HttpMethod.POST;
                            }

                            kindModel.MethodModels.Add(method.Name, methodModel);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                SimpleLog.Instance.WriteLogForDir("RESTful", ex);
            }
        }
示例#2
0
        private string GetTypeDetail(string name, Type type, int index)
        {
            StringBuilder sb = new StringBuilder();

            if (!string.IsNullOrEmpty(name))
            {
                for (int i = 0; i < index; i++)
                {
                    sb.Append("&nbsp;&nbsp;&nbsp;&nbsp;");
                }
                sb.AppendFormat(string.Format("&lt;{0} : {1}&gt;", name, GetTypeName(type)) + "<br/>");
            }

            type = CoreHelper.GetPrimitiveType(type);
            if (!CoreHelper.CheckPrimitiveType(type) || type.IsEnum)
            {
                if (type.IsEnum)
                {
                    var names  = Enum.GetNames(type);
                    var values = Enum.GetValues(type);

                    for (int i = 0; i < index; i++)
                    {
                        sb.Append("&nbsp;&nbsp;&nbsp;&nbsp;");
                    }
                    sb.Append("<b style='color:#999;'>[" + GetTypeName(type) + "]</b><br/>");
                    for (int n = 0; n < names.Length; n++)
                    {
                        for (int i = 0; i <= index; i++)
                        {
                            sb.Append("&nbsp;&nbsp;&nbsp;&nbsp;");
                        }
                        sb.AppendFormat(string.Format("&lt;{0} : {1}&gt;", names[n], Convert.ToInt32(values.GetValue(n))) + "<br/>");
                    }
                }
                else
                {
                    for (int i = 0; i < index; i++)
                    {
                        sb.Append("&nbsp;&nbsp;&nbsp;&nbsp;");
                    }
                    sb.Append("<b style='color:#999;'>[" + GetTypeName(type) + "]</b><br/>");

                    foreach (var p in CoreHelper.GetPropertiesFromType(type))
                    {
                        if (!CoreHelper.CheckPrimitiveType(p.PropertyType) && type != p.PropertyType)
                        {
                            sb.Append(GetTypeDetail(p.Name, p.PropertyType, index + 1));
                        }
                        else
                        {
                            for (int i = 0; i <= index; i++)
                            {
                                sb.Append("&nbsp;&nbsp;&nbsp;&nbsp;");
                            }
                            sb.AppendFormat(string.Format("&lt;{0} : {1}&gt;", p.Name, GetTypeName(p.PropertyType)) + "<br/>");
                        }
                    }

                    foreach (var p in type.GetFields())
                    {
                        if (!CoreHelper.CheckPrimitiveType(p.FieldType))
                        {
                            sb.Append(GetTypeDetail(p.Name, p.FieldType, index + 1));
                        }
                        else
                        {
                            for (int i = 0; i <= index; i++)
                            {
                                sb.Append("&nbsp;&nbsp;&nbsp;&nbsp;");
                            }
                            sb.AppendFormat(string.Format("&lt;{0} : {1}&gt;", p.Name, GetTypeName(p.FieldType)) + "<br/>");
                        }
                    }
                }
            }

            return(sb.ToString());
        }
示例#3
0
        /// <summary>
        /// 调用方法
        /// </summary>
        /// <param name="proxy"></param>
        /// <param name="method"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public object Invoke(object proxy, MethodInfo method, object[] parameters)
        {
            var attr = CoreHelper.GetMemberAttribute <PublishMethodAttribute>(method);

            if (attr == null)
            {
                return(null);
            }

            var httpMethod = HttpMethod.GET;

            if (!CoreHelper.CheckPrimitiveType(method.GetParameters().Select(p => p.ParameterType).ToArray()))
            {
                httpMethod = HttpMethod.POST;
            }

            string           name      = attribute.Name + "." + attr.Name;
            RESTfulParameter parameter = new RESTfulParameter(name, httpMethod, format);

            parameter.Token = token;

            if (httpMethod == HttpMethod.POST)
            {
                var collection = new Dictionary <string, object>();

                //添加参数
                var plist = method.GetParameters();
                for (int index = 0; index < parameters.Length; index++)
                {
                    collection[plist[index].Name] = parameters[index];
                }

                parameter.DataObject = collection;
            }
            else
            {
                //添加参数
                var plist = method.GetParameters();
                for (int index = 0; index < parameters.Length; index++)
                {
                    parameter.AddParameter(plist[index].Name, parameters[index]);
                }
            }


            //处理Cookies
            if (HttpContext.Current != null)
            {
                for (int index = 0; index < HttpContext.Current.Request.Cookies.Count; index++)
                {
                    var cookie = HttpContext.Current.Request.Cookies[index];
                    parameter.AddCookie(new Cookie
                    {
                        Name  = cookie.Name,
                        Value = cookie.Value.Replace(",", "%2C")
                    });
                }
            }

            RESTfulRequest request = new RESTfulRequest(parameter);

            if (!string.IsNullOrEmpty(url))
            {
                request.Url = url;
            }
            request.Timeout = timeout;

            return(request.GetResponse(method.ReturnType));
        }
示例#4
0
        /// <summary>
        /// 生成API文档
        /// </summary>
        /// <returns></returns>
        public string MakeDocument(Uri requestUri, string kind, string method)
        {
            #region 读取资源

            Assembly assm           = this.GetType().Assembly;
            Stream   helpStream     = assm.GetManifestResourceStream("MySoft.RESTful.Template.help.htm");
            Stream   helpitemStream = assm.GetManifestResourceStream("MySoft.RESTful.Template.helpitem.htm");

            StreamReader helpReader     = new StreamReader(helpStream);
            StreamReader helpitemReader = new StreamReader(helpitemStream);

            string html = helpReader.ReadToEnd(); helpReader.Close();
            string item = helpitemReader.ReadToEnd(); helpitemReader.Close();

            #endregion

            string uri = string.Format("http://{0}/", requestUri.Authority.Replace("127.0.0.1", DnsHelper.GetIPAddress()));
            html = html.Replace("${uri}", uri);

            var sb = new StringBuilder();
            foreach (BusinessKindModel e in pool.KindMethods.Values.OrderBy(p => p.Name).ToList())
            {
                sb.AppendFormat("<a href='/help/{0}' title='{1}'>{0}</a>", e.Name, e.Description);
                sb.AppendFormat("&nbsp;&nbsp;");
            }

            html = html.Replace("${kind}", sb.ToString());

            StringBuilder            table = new StringBuilder();
            List <BusinessKindModel> list  = new List <BusinessKindModel>();
            if (string.IsNullOrEmpty(kind))
            {
                list.AddRange(pool.KindMethods.Values);
            }
            else
            {
                var model = pool.GetKindModel(kind);
                if (model != null)
                {
                    if (string.IsNullOrEmpty(method))
                    {
                        list.Add(model);
                    }
                    else
                    {
                        var m = model.MethodModels.Values.Where(p => string.Compare(p.Name, method, true) == 0).FirstOrDefault();
                        if (m != null)
                        {
                            var mod = new BusinessKindModel
                            {
                                Name        = model.Name,
                                Description = model.Description
                            };
                            mod.MethodModels.Add(m.Name, m);
                            list.Add(mod);
                        }
                        else
                        {
                            table.Append("<tr><td colspan=\"5\" style=\"padding: 30px 300px 30px 300px; text-align: center;\">没有匹配到指定方法的服务!</td></tr>");
                        }
                    }
                }
                else
                {
                    table.Append("<tr><td colspan=\"5\" style=\"padding: 30px 300px 30px 300px; text-align: center;\">没有匹配到指定类型的服务!</td></tr>");
                }
            }

            var kinds = list.OrderBy(p => p.Name).ToList();
            foreach (BusinessKindModel e in kinds)
            {
                StringBuilder items   = new StringBuilder();
                var           methods = e.MethodModels.Values.OrderBy(p => p.Name).ToList();
                foreach (BusinessMethodModel model in methods)
                {
                    string template = item;
                    var    tempStr  = string.Format("<a href='/help/{0}/{1}'>{0}.{2}</a> [<font color='red'>{4}</font>]<br/>{3}", e.Name, model.Name, model.Name, model.Description, model.ParametersCount);
                    template = template.Replace("${method}", tempStr);

                    var plist = new List <string>();
                    foreach (var p in model.Parameters)
                    {
                        if (CoreHelper.CheckPrimitiveType(p.ParameterType))
                        {
                            plist.Add(string.Format("{0}=[{0}]", p.Name.ToLower()).Replace('[', '{').Replace(']', '}'));
                        }
                    }

                    string strParameter = GetMethodParameter(model, kind, method);
                    if (string.IsNullOrEmpty(strParameter))
                    {
                        template = template.Replace("${parameter}", "&nbsp;");
                    }
                    else
                    {
                        template = template.Replace("${parameter}", strParameter);
                    }

                    template = template.Replace("${type}", model.HttpMethod == HttpMethod.GET ? "GET<br/>POST" : "<font color='red'>POST</font>");
                    template = template.Replace("${auth}", model.Authorized ? "<font color='red'>是</font>" : "&nbsp;");

                    StringBuilder anchor = new StringBuilder();
                    anchor.Append(CreateAnchorHtml(requestUri, e, model, plist, model.HttpMethod, "xml"));
                    anchor.Append("<br/>");
                    anchor.Append(CreateAnchorHtml(requestUri, e, model, plist, model.HttpMethod, "json"));
                    if (model.HttpMethod == HttpMethod.GET)
                    {
                        anchor.Append("<br/>");
                        anchor.Append(CreateAnchorHtml(requestUri, e, model, plist, model.HttpMethod, "jsonp"));

                        if (model.Method.ReturnType == typeof(string))
                        {
                            anchor.Append("<br/>");
                            anchor.Append(CreateAnchorHtml(requestUri, e, model, plist, model.HttpMethod, "text"));
                            anchor.Append("<br/>");
                            anchor.Append(CreateAnchorHtml(requestUri, e, model, plist, model.HttpMethod, "html"));
                        }
                    }

                    template = template.Replace("${uri}", anchor.ToString());
                    items.Append(template);
                }

                table.Append(items.ToString());
            }

            return(html.Replace("${body}", table.ToString()));
        }