Время генерации страницы - ASP.Net MVC
Я ищу способ отслеживать, сколько времени потребовалось для создания страницы сервером. Я знаю, что могу использовать Trace для отслеживания этого, но мне нужен способ показать это на странице.
Его ASP.Net MVC 2
Ответы
Ответ 1
Да, предложение Derin является стандартным способом сделать это в приложении ASP.NEt, я бы просто предложил добавить, если он не мешает не-HTML-ответам:
EDIT: добавлена полная реализация
public class PerformanceMonitorModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += delegate(object sender, EventArgs e)
{
//Set Page Timer Star
HttpContext requestContext = ((HttpApplication)sender).Context;
Stopwatch timer = new Stopwatch();
requestContext.Items["Timer"] = timer;
timer.Start();
};
context.PostRequestHandlerExecute += delegate(object sender, EventArgs e)
{
HttpContext httpContext = ((HttpApplication)sender).Context;
HttpResponse response = httpContext.Response;
Stopwatch timer = (Stopwatch)httpContext.Items["Timer"];
timer.Stop();
// Don't interfere with non-HTML responses
if (response.ContentType == "text/html")
{
double seconds = (double)timer.ElapsedTicks / Stopwatch.Frequency;
string result_time = string.Format("{0:F4} sec ", seconds);
RenderQueriesToResponse(response,result_time);
}
};
}
void RenderQueriesToResponse(HttpResponse response, string result_time)
{
response.Write("<div style=\"margin: 5px; background-color: #FFFF00\"");
response.Write(string.Format("<b>Page Generated in "+ result_time));
response.Write("</div>");
}
public void Dispose() { /* Not needed */ }
}
вы также можете добавить к нему некоторый стиль...
И не забудьте зарегистрировать свой модуль в WebConfig в разделе httpModules:
<add name="Name" type="namespace, dll"/>
Полный справочник об этой проверке Pro ASP.NET MVC Framework Стивеном Сандерсоном - Глава 15 - Производительность, Мониторинг времени создания страницы.
EDIT: (комментарий @Pino)
Вот пример моего проекта:
alt text http://www.diarioplus.com/files/pictures/example_performance.JPG
Ответ 2
Вы можете реализовать его как ActionFilterAttribute
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class LoggingAttribute : ActionFilterAttribute
{
private readonly Stopwatch _sw;
public LoggingAttribute()
{
_sw = new Stopwatch();
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_sw.Start();
Debug.WriteLine("Beginning executing: " + GetControllerAndActionName(filterContext.ActionDescriptor));
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
_sw.Stop();
var ms = _sw.ElapsedMilliseconds;
Debug.WriteLine("Finishing executing: " + GetControllerAndActionName(filterContext.ActionDescriptor));
Debug.WriteLine("Time elapsed: "+ TimeSpan.FromMilliseconds(ms).TotalSeconds);
}
private string GetControllerAndActionName(ActionDescriptor actionDescriptor)
{
return actionDescriptor.ControllerDescriptor.ControllerName + " - " + actionDescriptor.ActionName;
}
}
Украсьте каждый контроллер или метод действия с ним и вуалой, он выплюнул текст в отладочном режиме.
EDIT: если вы хотите распечатать его на странице, вы можете добавить этот фрагмент к методу OnActionExecuted
if(filterContext.Result is ViewResult) { //Make sure the request is a ViewResult, ie. a page
((ViewResult) filterContext.Result).ViewData["ExecutionTime"] = ms; //Set the viewdata dictionary
}
Теперь у вас есть время выполнения, сохраненное в ViewData, и вы можете получить к нему доступ на странице. Обычно я помещаю его на главную страницу, например
<!-- The page took <%= ViewData["ExecutionTime"] %> ms to execute -->
Ответ 3
Это будет зависеть от того, где вы хотите включить эту информацию. Например, вы можете написать обработчик http, который отобразит время рендеринга после тега </html>
:
public class RenderTimeModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += (sender, e) =>
{
var watch = new Stopwatch();
var app = (HttpApplication)sender;
app.Context.Items["Stopwatch"] = watch;
watch.Start();
};
context.EndRequest += (sender, e) =>
{
var app = (HttpApplication)sender;
var watch = (Stopwatch)app.Context.Items["Stopwatch"];
watch.Stop();
var ts = watch.Elapsed;
string elapsedTime = String.Format("{0} ms", ts.TotalMilliseconds);
app.Context.Response.Write(elapsedTime);
};
}
public void Dispose()
{
}
}
Если вы хотите отобразить время рендеринга где-то посередине html-страницы, тогда это время рендеринга не учитывает итоговое время рендеринга страницы.