Ich habe in die Solution Fortuna.Web.Tools einen Profiler eingebaut. Der Profiler wird derzeit nur auf der Entwicklungs- und Testumgebung aktiviert. In der Produktivumgebung sollte dieser nicht zum Einsatz kommen, da die Profiling-Ergebnisse auf den jeweiligen Seiten eingeblendet werden. Realisiert wird dies über ein Conditional Compiler Symbol (PROFILER_ACTIVE) in den Eigenschaften der Webapplikation. In den Konfigurationen Debug und Test wird dies gesetzt; das sind die Konfigurationen, die beim Publishen auf die Entwicklungsumgebung (Debug) bzw. Testumgebung (Test) verwendet werden.
Verwendet wird der Miniprofiler für .NET, welcher über nuget ins Projekt integriert wurde.
In der global.asax wurden die Anweisungen zum Starten bzw. beenden des Profilers hinzugefügt:
protected void Application_BeginRequest()
{
#if PROFILER_ACTIVE
MiniProfiler.Start();
#endif
}
protected void Application_EndRequest()
{
#if PROFILER_ACTIVE
MiniProfiler.Stop();
#endif
}
In der _Layout.cshtml wurde als letzte Zeile im <body> die Ausgabe der Profilerdaten integriert:
@MiniProfiler.RenderIncludes()
In den Controllern kann man dann beliebige Codeblöcke profilen.
Beispiel Homecontroller:
using StackExchange.Profiling;
...
[Authorize]
public ActionResult Index()
{
var profiler = MiniProfiler.Current;
using(profiler.Step("Home - Index: Darf Investment"))
{
ViewBag.DarfInvestment = DarfInvestment(User.Vermittler().OrgId);
}
return View();
}
Beispiel AccountController:
[HttpPost]
public ActionResult Login(LogOnModel logOnModel, string returnUrl)
{
var profiler = MiniProfiler.Current;
using (profiler.Step("Account - Login: Start"))
{
if (ModelState.IsValid)
{
using (profiler.Step("Account - Login: SignIn"))
{
if (AuthenticationHelper.SignIn(logOnModel))
{
using (profiler.Step("Account - Login: IsCustomer"))
{
if (AuthenticationHelper.IsCustomer(logOnModel.UserName))
{
using (profiler.Step("Account - Login: Logout"))
{
Logout();
ModelState.AddModelError("", Resources.ERR_KUNDE_STATT_VERMITTLER);
}
}
else
{
using (profiler.Step("Account - Login: IsLocalUrl"))
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
}
}
}
else
{
ModelState.AddModelError("", Resources.ERR_BENUTZER_FALSCH);
}
}
}
}
using (profiler.Step("Account - Login: return View"))
{
return View(logOnModel);
}
}