using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; namespace Song.ViewData.Attri { /// /// HTTP谓词限制特性的父类 /// public class HttpAttribute : WebAttribute { /// /// 验证是否满足特性的限定 /// /// http请求方法,即谓词 /// 执行的方法 /// public static HttpAttribute Verify(string httpmethod, MemberInfo method) { //如果方法没有设置任何HTTP限制,则不验证 List https = WeishaAttr.GetAttrs(method); if (https.Count < 1) return null; //如果是第一次运行,获取所有特性 Type[] attrs = Initialization(); //通过http请求的谓词,获取需要验证的特性 string httpattrname = string.Format("http{0}Attribute", httpmethod); Type type = null; foreach (Type att in attrs) { if (att.Name.Equals(httpattrname, StringComparison.CurrentCultureIgnoreCase)) { type = att; break; } } //验证特性 HttpAttribute attr = null; //先验证对象,如果对象需验证,则下面方法全部需要验证登录,除非方法设置了[(Ignore = true)] object[] attrsObj = method.DeclaringType.GetCustomAttributes(type, true); if (attrsObj.Length > 0) attr = attrsObj[0] as HttpAttribute; //再验证方法 object[] attrsMethod = method.GetCustomAttributes(type, true); if (attrsMethod.Length > 0) { HttpAttribute admin = attrsMethod[0] as HttpAttribute; if (attr == null) attr = admin; if (attr != null && admin.Ignore) attr.Ignore = admin.Ignore; } if (attr == null || attr.Ignore) throw new Exception(string.Format("当前接口方法 {0}.{1} 禁止 HTTP {2} 请求", method.DeclaringType.Name, method.Name, httpmethod.ToUpper())); return attr; } } }