private void ResetControllActions() { //((CustomRazorViewEngine)_razorViewEngine).ClearCache(); //((CustomRuntimeViewCompiler)_viewCompiler.GetCompiler()).ClearCache(); #region 通过反射清空缓存 //注意:以下反射的是内部类,随着版本升级字段名可能不同 var viewLookupCacheField = _razorViewEngine.GetType().GetProperty("ViewLookupCache", BindingFlags.Instance | BindingFlags.NonPublic); var viewLookupCache = viewLookupCacheField.GetValue(_razorViewEngine) as MemoryCache; viewLookupCache?.Clear(); var viewCompiler = _viewCompiler.GetCompiler(); var precompiledViewCacheField = viewCompiler.GetType().GetField("_cache", BindingFlags.Instance | BindingFlags.NonPublic); var precompiledViewCache = precompiledViewCacheField.GetValue(viewCompiler) as MemoryCache; precompiledViewCache?.Clear(); var precompiledViewsField = viewCompiler.GetType().GetField("_precompiledViews", BindingFlags.Instance | BindingFlags.NonPublic); var precompiledViews = precompiledViewsField.GetValue(viewCompiler) as Dictionary <string, CompiledViewDescriptor>; var feature = new ViewsFeature(); _partManager.PopulateFeature(feature); foreach (var precompiledView in feature.ViewDescriptors) { if (!precompiledViews.ContainsKey(precompiledView.RelativePath)) { // View ordering has precedence semantics, a view with a higher precedence was // already added to the list. precompiledViews.Add(precompiledView.RelativePath, precompiledView); } else { var oldPreCompiledView = precompiledViews[precompiledView.RelativePath]; if (oldPreCompiledView.Type != precompiledView.Type) { precompiledViews[precompiledView.RelativePath] = precompiledView; } } } #endregion _dynamicChangeTokenProvider.NotifyChanges(); }
public RazorHotReload( IRazorViewEngine razorViewEngine, IRazorPageActivator razorPageActivator, ITagHelperFactory tagHelperFactory, IViewCompilerProvider viewCompilerProvider, ITagHelperComponentPropertyActivator tagHelperComponentPropertyActivator, ApplicationPartManager applicationPartManager) { // For Razor view services, use the service locator pattern because they views not be registered by default. _razorCompiledItemFeatureProvider = applicationPartManager.FeatureProviders.OfType <RazorCompiledItemFeatureProvider>().FirstOrDefault(); if (viewCompilerProvider is DefaultViewCompiler defaultViewCompiler) { _defaultViewCompiler = defaultViewCompiler; } if (razorViewEngine.GetType() == typeof(RazorViewEngine)) { _razorViewEngine = (RazorViewEngine)razorViewEngine; } if (razorPageActivator.GetType() == typeof(RazorPageActivator)) { _razorPageActivator = (RazorPageActivator)razorPageActivator; } if (tagHelperFactory is DefaultTagHelperFactory defaultTagHelperFactory) { _defaultTagHelperFactory = defaultTagHelperFactory; } if (tagHelperComponentPropertyActivator is TagHelperComponentPropertyActivator defaultTagHelperComponentPropertyActivator) { _tagHelperComponentPropertyActivator = defaultTagHelperComponentPropertyActivator; } }