/// <summary> /// Gets the ControllerInfo collection from a list of types. /// </summary> /// <param name="targetTypes">The types that contain controllers.</param> /// <param name="kind">The kind of controller to get infos for (Web/API)</param> /// <returns></returns> private static IEnumerable <ControllerInfo> GetControllerInfos(IEnumerable <ControllerItem> targetTypes, ControllerKind kind) { var types = targetTypes.Where(t => t.Kind == kind).Select(t => t.Type); var controllerInfos = new List <ControllerInfo>(types.Count()); foreach (var targetType in types) { var customAttributes = targetType.GetCustomAttributes(false); //Ignore if controller is marked with [SkipJavascriptGeneration] if (customAttributes.OfType <SkipJavascriptGenerationAttribute>().Any()) { continue; } var controllerInfo = new ControllerInfo { ControllerType = targetType, Kind = kind, UseNamespace = customAttributes.OfType <GenerateWithNamespaceAttribute>().Any(), EnableClientCaching = customAttributes.OfType <EnableClientCacheAttribute>().Any() }; ApiReflector.GetActionInfos(controllerInfo, kind); if (controllerInfo.Actions.Any()) { controllerInfos.Add(controllerInfo); } } return(controllerInfos); }
/// <summary> /// Loads an assembly for reflection. /// </summary> /// <param name="assemblyName">The fully qualified assembly name.</param> /// <returns></returns> static public string GenerateControllerScript(string assemblyName) { var apiControllerTypes = ApiReflector.GetApiControllerTypes(assemblyName); var apiControllerInfos = ApiReflector.GetControllerInfos(apiControllerTypes, ControllerKind.Api); var mvcControllerInfos = ApiReflector.GetControllerInfos(apiControllerTypes, ControllerKind.Mvc); var stringBuilder = ApiReflector.GenerateApiControllerScripts(apiControllerInfos); stringBuilder.AppendLine(); stringBuilder.Append(ApiReflector.GenerateMvcControllerScripts(mvcControllerInfos)); return(stringBuilder.ToString()); }
public void ProcessRequest(HttpContext context) { var js = new StringBuilder(); #if !DEBUG var minifier = new Microsoft.Ajax.Utilities.Minifier(); #endif context.Response.ContentType = "text/javascript"; // ReSharper disable RedundantAssignment var cachedStaticFilesResult = MemoryCache.Default.Get("ED47.Stack.Reflector.Static") as string; // ReSharper restore RedundantAssignment #if DEBUG //Disable caching during development to make debugging easier cachedStaticFilesResult = null; #endif // ReSharper disable ConditionIsAlwaysTrueOrFalse if (cachedStaticFilesResult == null) // ReSharper restore ConditionIsAlwaysTrueOrFalse { var staticScriptBuilder = new StringBuilder(); staticScriptBuilder.AppendLine("/*================== STATIC SCRIPTS ==================*/"); ReflectorHandler.AppendStaticScripts(staticScriptBuilder); staticScriptBuilder.AppendLine("/*=====================================================*/"); cachedStaticFilesResult = staticScriptBuilder.ToString(); } js.Append(cachedStaticFilesResult); var assemblyNames = context.Request.QueryString["assemblyName"]; if (String.IsNullOrWhiteSpace(assemblyNames)) { context.Response.ContentType = "text/javascript"; #if !DEBUG context.Response.Write(minifier.MinifyJavaScript(js.ToString())); #else context.Response.Write(js.ToString()); #endif return; } var assemblyNameArray = assemblyNames.Split(';'); foreach (var assemblyName in assemblyNameArray) { var cacheKey = "ED47.Stack.Reflector?assemblyName=" + assemblyName; // ReSharper disable RedundantAssignment var cachedResult = MemoryCache.Default.Get(cacheKey) as string; // ReSharper restore RedundantAssignment #if DEBUG cachedResult = null; //Disable caching during development to make debugging easier #endif // ReSharper disable ConditionIsAlwaysTrueOrFalse if (cachedResult == null) // ReSharper restore ConditionIsAlwaysTrueOrFalse { cachedResult = ApiReflector.GenerateControllerScript(assemblyName) + ModelReflector.GenerateModelScript(assemblyName); MemoryCache.Default.Add(new CacheItem(cacheKey, cachedResult), new CacheItemPolicy { Priority = CacheItemPriority.NotRemovable }); } js.Append(cachedResult); } #if DEBUG context.Response.Write(js.ToString()); #else context.Response.Write(minifier.MinifyJavaScript(js.ToString())); #endif }