diff --git a/src/Umbraco.Core/Profiling/ProfilerExtensions.cs b/src/Umbraco.Core/Profiling/ProfilerExtensions.cs new file mode 100644 index 0000000000..0bdb38fd95 --- /dev/null +++ b/src/Umbraco.Core/Profiling/ProfilerExtensions.cs @@ -0,0 +1,19 @@ +using System; + +namespace Umbraco.Core.Profiling +{ + public static class ProfilerExtensions + { + /// + /// Writes out a step prefixed with the type + /// + /// + /// + /// + /// + public static IDisposable Step(this IProfiler profiler, string name) + { + return profiler.Step(string.Format(typeof (T).Name + ", " + name)); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Profiling/WebProfiler.cs b/src/Umbraco.Core/Profiling/WebProfiler.cs index 1209b884ae..99465102e7 100644 --- a/src/Umbraco.Core/Profiling/WebProfiler.cs +++ b/src/Umbraco.Core/Profiling/WebProfiler.cs @@ -2,6 +2,7 @@ using System.Web; using StackExchange.Profiling; using Umbraco.Core.Configuration; +using Umbraco.Core.Logging; namespace Umbraco.Core.Profiling { @@ -10,18 +11,15 @@ namespace Umbraco.Core.Profiling /// public class WebProfiler : IProfiler { - private readonly UmbracoApplicationBase _umbracoApplication; /// /// Constructor /// - /// /// /// Binds to application events to enable the MiniProfiler /// - internal WebProfiler(UmbracoApplicationBase umbracoApplication) + internal WebProfiler() { - _umbracoApplication = umbracoApplication; UmbracoApplicationBase.ApplicationInit += UmbracoApplicationApplicationInit; } @@ -34,8 +32,17 @@ namespace Umbraco.Core.Profiling { var app = sender as HttpApplication; if (app == null) return; - app.BeginRequest += UmbracoApplicationBeginRequest; - app.EndRequest += UmbracoApplicationEndRequest; + + if (SystemUtilities.GetCurrentTrustLevel() < AspNetHostingPermissionLevel.High) + { + //If we don't have a high enough trust level we cannot bind to the events + LogHelper.Info("Cannot start the WebProfiler since the application is running in Medium trust"); + } + else + { + app.BeginRequest += UmbracoApplicationBeginRequest; + app.EndRequest += UmbracoApplicationEndRequest; + } } /// diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 4399ee9f4e..f013f5a6b7 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -523,6 +523,7 @@ + diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 8e876f6b63..a4a693bcb9 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -237,7 +237,7 @@ namespace Umbraco.Web base.InitializeResolvers(); //Set the profiler to be the web profiler - ProfilerResolver.Current.SetProfiler(new WebProfiler(UmbracoApplication)); + ProfilerResolver.Current.SetProfiler(new WebProfiler()); //set the default RenderMvcController DefaultRenderMvcControllerResolver.Current = new DefaultRenderMvcControllerResolver(typeof(RenderMvcController)); diff --git a/src/Umbraco.Web/umbraco.presentation/default.aspx.cs b/src/Umbraco.Web/umbraco.presentation/default.aspx.cs index 5b932011d9..b3727b4a31 100644 --- a/src/Umbraco.Web/umbraco.presentation/default.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/default.aspx.cs @@ -45,11 +45,11 @@ namespace umbraco protected override void OnPreInit(EventArgs e) { base.OnPreInit(e); - using (ProfilerResolver.Current.Profiler.Step("PreInit")) + using (ProfilerResolver.Current.Profiler.Step("PreInit")) { // handle the infamous umbDebugShowTrace, etc - Page.Trace.IsEnabled &= GlobalSettings.DebugMode && !String.IsNullOrWhiteSpace(Request["umbDebugShowTrace"]); + Page.Trace.IsEnabled &= GlobalSettings.DebugMode && string.IsNullOrWhiteSpace(Request["umbDebugShowTrace"]) == false; // get the document request and the page _docRequest = UmbracoContext.Current.PublishedContentRequest; @@ -82,7 +82,7 @@ namespace umbraco protected override void OnInit(EventArgs e) { - using (ProfilerResolver.Current.Profiler.Step("Init")) + using (ProfilerResolver.Current.Profiler.Step("Init")) { base.OnInit(e); @@ -119,7 +119,7 @@ namespace umbraco protected override void OnLoad(EventArgs e) { - using (ProfilerResolver.Current.Profiler.Step("Load")) + using (ProfilerResolver.Current.Profiler.Step("Load")) { base.OnLoad(e); @@ -133,7 +133,7 @@ namespace umbraco protected override void Render(HtmlTextWriter writer) { - using (ProfilerResolver.Current.Profiler.Step("Render")) + using (ProfilerResolver.Current.Profiler.Step("Render")) { // do the original rendering diff --git a/src/Umbraco.Web/umbraco.presentation/helper.cs b/src/Umbraco.Web/umbraco.presentation/helper.cs index 252cfbad99..da93812949 100644 --- a/src/Umbraco.Web/umbraco.presentation/helper.cs +++ b/src/Umbraco.Web/umbraco.presentation/helper.cs @@ -127,9 +127,6 @@ namespace umbraco !string.IsNullOrEmpty(currentNode.FirstChild.Value) && !string.IsNullOrEmpty(currentNode.FirstChild.Value.Trim())) { - ProfilerResolver.Current.Profiler.Step("Loaded Recursively from " + - splitpath[ - splitpath.Length - i - 1]); HttpContext.Current.Trace.Write("parameter.recursive", "Item loaded from " + splitpath[splitpath.Length - i - 1]); attributeValue = currentNode.FirstChild.Value; break; diff --git a/src/Umbraco.Web/umbraco.presentation/item.cs b/src/Umbraco.Web/umbraco.presentation/item.cs index 9373dfb61c..f864e9494c 100644 --- a/src/Umbraco.Web/umbraco.presentation/item.cs +++ b/src/Umbraco.Web/umbraco.presentation/item.cs @@ -98,7 +98,7 @@ namespace umbraco /// private string GetRecursiveValueLegacy(IDictionary elements) { - using (ProfilerResolver.Current.Profiler.Step("Checking recusively")) + using (ProfilerResolver.Current.Profiler.Step("Checking recusively")) { var content = ""; @@ -119,8 +119,6 @@ namespace umbraco if (currentNode == null || currentNode.FirstChild == null || string.IsNullOrEmpty(currentNode.FirstChild.Value) || string.IsNullOrEmpty(currentNode.FirstChild.Value.Trim())) continue; - ProfilerResolver.Current.Profiler.Step("Found recursive value on " + - splitpath[splitpath.Length - i - 1]); HttpContext.Current.Trace.Write("item.recursive", "Item loaded from " + splitpath[splitpath.Length - i - 1]); content = currentNode.FirstChild.Value; break; @@ -132,7 +130,7 @@ namespace umbraco private void ParseItem(IDictionary attributes) { - using (ProfilerResolver.Current.Profiler.Step("Start parsing " + _fieldName)) + using (ProfilerResolver.Current.Profiler.Step("Start parsing " + _fieldName)) { HttpContext.Current.Trace.Write("item", "Start parsing '" + _fieldName + "'"); if (helper.FindAttribute(attributes, "textIfEmpty") != "" && _fieldContent == "") diff --git a/src/Umbraco.Web/umbraco.presentation/macro.cs b/src/Umbraco.Web/umbraco.presentation/macro.cs index 29c26e077e..465eba4a0c 100644 --- a/src/Umbraco.Web/umbraco.presentation/macro.cs +++ b/src/Umbraco.Web/umbraco.presentation/macro.cs @@ -234,10 +234,10 @@ namespace umbraco var macroInfo = (Model.MacroType == MacroTypes.Script && Model.Name.IsNullOrWhiteSpace()) ? string.Format("Render Inline Macro, Cache: {0})", Model.CacheDuration) : string.Format("Render Macro: {0}, type: {1}, cache: {2})", Name, Model.MacroType, Model.CacheDuration); - - using (ProfilerResolver.Current.Profiler.Step(macroInfo)) + + using (ProfilerResolver.Current.Profiler.Step(macroInfo)) { - TraceInfo("renderMacro", macroInfo, excludeProfiling: true); + TraceInfo("renderMacro", macroInfo); StateHelper.SetContextValue(MacrosAddedKey, StateHelper.GetContextValue(MacrosAddedKey) + 1); @@ -281,7 +281,7 @@ namespace umbraco return GetControlForErrorBehavior("Error loading Partial View script (file: " + ScriptFile + ")", macroErrorEventArgs); }; - using (ProfilerResolver.Current.Profiler.Step("Executing Partial View: " + Model.TypeName)) + using (ProfilerResolver.Current.Profiler.Step("Executing Partial View: " + Model.TypeName)) { TraceInfo("umbracoMacro", "Partial View added (" + Model.TypeName + ")"); try @@ -316,8 +316,8 @@ namespace umbraco break; } case (int) MacroTypes.UserControl: - - using (ProfilerResolver.Current.Profiler.Step("Executing UserControl: " + Model.TypeName)) + + using (ProfilerResolver.Current.Profiler.Step("Executing UserControl: " + Model.TypeName)) { try { @@ -360,8 +360,8 @@ namespace umbraco } case (int) MacroTypes.CustomControl: - - using (ProfilerResolver.Current.Profiler.Step("Executing CustomControl: " + Model.TypeName + "." + Model.TypeAssembly)) + + using (ProfilerResolver.Current.Profiler.Step("Executing CustomControl: " + Model.TypeName + "." + Model.TypeAssembly)) { try { @@ -423,7 +423,7 @@ namespace umbraco return GetControlForErrorBehavior("Error loading MacroEngine script (file: " + ScriptFile + ")", macroErrorEventArgs); }; - using (ProfilerResolver.Current.Profiler.Step("Executing MacroEngineScript: " + ScriptFile)) + using (ProfilerResolver.Current.Profiler.Step("Executing MacroEngineScript: " + ScriptFile)) { try { @@ -500,7 +500,7 @@ namespace umbraco { string dateAddedCacheKey; - using (ProfilerResolver.Current.Profiler.Step("Saving MacroContent To Cache: " + Model.CacheIdentifier)) + using (ProfilerResolver.Current.Profiler.Step("Saving MacroContent To Cache: " + Model.CacheIdentifier)) { // NH: Scripts and XSLT can be generated as strings, but not controls as page events wouldn't be hit (such as Page_Load, etc) @@ -830,7 +830,7 @@ namespace umbraco return new LiteralControl(string.Empty); } - using (ProfilerResolver.Current.Profiler.Step("Executing XSLT: " + XsltFile)) + using (ProfilerResolver.Current.Profiler.Step("Executing XSLT: " + XsltFile)) { XmlDocument macroXml = null; @@ -859,7 +859,7 @@ namespace umbraco { var xsltFile = getXslt(XsltFile); - using (ProfilerResolver.Current.Profiler.Step("Performing transformation")) + using (ProfilerResolver.Current.Profiler.Step("Performing transformation")) { try { @@ -1661,34 +1661,16 @@ namespace umbraco } } - private static void TraceInfo(string category, string message, bool excludeProfiling = false) + private static void TraceInfo(string category, string message) { if (HttpContext.Current != null) - HttpContext.Current.Trace.Write(category, message); - - //Trace out to profiling... doesn't actually profile, just for informational output. - if (excludeProfiling == false) - { - //NOTE: we cannot even do this since it throws an exception, need to use using clause: ProfilerResolver.Current.Profiler.Step(message).Dispose(); - using (ProfilerResolver.Current.Profiler.Step(message)) - { - } - } + HttpContext.Current.Trace.Write(category, message); } - private static void TraceWarn(string category, string message, bool excludeProfiling = false) + private static void TraceWarn(string category, string message) { if (HttpContext.Current != null) HttpContext.Current.Trace.Warn(category, message); - - //Trace out to profiling... doesn't actually profile, just for informational output. - if (excludeProfiling == false) - { - //NOTE: we cannot even do this since it throws an exception, need to use using clause: ProfilerResolver.Current.Profiler.Step(message).Dispose(); - using (ProfilerResolver.Current.Profiler.Step(message)) - { - } - } } private static void TraceWarn(string category, string message, Exception ex, bool excludeProfiling = false) diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs index f951bc13db..341009f024 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/templateControls/ItemRenderer.cs @@ -134,7 +134,7 @@ namespace umbraco.presentation.templateControls /// The item. public virtual void Load(Item item) { - using (ProfilerResolver.Current.Profiler.Step(string.Format("Item: {0}", item.Field))) + using (ProfilerResolver.Current.Profiler.Step(string.Format("Item: {0}", item.Field))) { ParseMacros(item); } @@ -152,7 +152,7 @@ namespace umbraco.presentation.templateControls string elementText = GetFieldContents(item); - using (ProfilerResolver.Current.Profiler.Step("Parsing Macros")) + using (ProfilerResolver.Current.Profiler.Step("Parsing Macros")) { MacroTagParser.ParseMacros(