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); } }
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(" "); } sb.AppendFormat(string.Format("<{0} : {1}>", 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(" "); } 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(" "); } sb.AppendFormat(string.Format("<{0} : {1}>", names[n], Convert.ToInt32(values.GetValue(n))) + "<br/>"); } } else { for (int i = 0; i < index; i++) { sb.Append(" "); } 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(" "); } sb.AppendFormat(string.Format("<{0} : {1}>", 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(" "); } sb.AppendFormat(string.Format("<{0} : {1}>", p.Name, GetTypeName(p.FieldType)) + "<br/>"); } } } } return(sb.ToString()); }
/// <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)); }
/// <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(" "); } 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}", " "); } 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>" : " "); 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())); }