ASP.NET MVC: ActionFilter zum Loggen benutzen

Die neue “pre”-Preview 3 des MVC Frameworks (siehe hier für mehr Informationen) bringt einige Veränderungen  mit sich. Insbesondere wurden die ActionFilter erweitert. Aus dem alten “FilterExecutingContext” etc. wurde der “ActionExcetuingContext” usw.
Es gibt zudem 2 neue Methoden zum Überschreiben, welche kurz vor dem Rendern passieren. Hier die komplette Liste an Methoden, welche ein ActionFilter haben kann:

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            ActionExecutingContext contect = filterContext;
            string test = contect.ActionMethod.ToString();
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            ActionExecutedContext context = filterContext;
            string test = context.ActionMethod.ToString();
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            ResultExecutingContext context = filterContext;
            string test = context.ToString();
        }


        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            ResultExecutedContext context = filterContext;
            string test = context.ToString();
        }

Die großartigste Neuerung: Man kann nun von diesen ActionFiltern auf die ViewDaten zugreifen und zwar in den folgenden Contexten:

  • ResultExecutedContext
  • ResultExecutingContext
  • ActionExecutedContext Yeah!

image 

Durch diesen Zugriff können wir uns auch einen cleveren Logger implementieren, welcher das über Log4Net abspeichert.

Um die ViewDaten rekursiv durchzugehen nutze ich diesen “DumpObject Code” und die Konfiguration wie hier.

Die (momentan) recht einfache Logging-Funktion in unserm LogFilter:

namespace Mvc2.Filters
{
    public class LogAttribute : ActionFilterAttribute
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(LogAttribute).Name);

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            ActionExecutedContext context = filterContext;
            
            StringBuilder logMessage = new StringBuilder();
            logMessage.AppendLine(context.ActionMethod.Name);
            
            if(context.Result.GetType() == typeof(RenderViewResult))
            {
                RenderViewResult viewResult = context.Result as RenderViewResult;
                logMessage.AppendLine("ActionResult: RenderViewResult");
                logMessage.AppendLine();
                logMessage.AppendLine(Dumper.DumpObject(viewResult.ViewData, 5));
            }
            logMessage.AppendLine();
            log.Info(logMessage.ToString());
        }

    }
}

Dieses ActionFilter Attribut können wir jetzt einfach auf unseren Controller oder direkt auf die ActionMethods setzen:

[Log]
public class EntryController : Controller
{...}

Das Ergebnis in der log.txt:

2008-04-17 20:41:02,204 [10] INFO  LogAttribute [(null)] - List
ActionResult: RenderViewResult

[ObjectToDump] AS Mvc2.Views.Entry.ListViewData = Mvc2.Views.Entry.ListViewData
+<EntryList>k__BackingField AS Mvc2.Helpers.PagedList`1[[Mvc2.Models.DataObjects.Entry, Mvc2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] = Mvc2.Helpers.PagedList`1[Mvc2.Models.DataObjects.Entry]
|+<TotalPages>k__BackingField AS System.Int32 = 2
|+<TotalCount>k__BackingField AS System.Int32 = 17
|+<PageIndex>k__BackingField AS System.Int32 = 1
|+<PageSize>k__BackingField AS System.Int32 = 10
+(System.Collections.Generic.List`1[[Mvc2.Models.DataObjects.Entry, Mvc2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]])
|+_items AS Mvc2.Models.DataObjects.Entry[] = Mvc2.Models.DataObjects.Entry[]
||+[0] AS Mvc2.Models.DataObjects.Entry = Mvc2.Models.DataObjects.Entry
|||+_Id AS System.Guid = 797c70f0-f571-4969-80e8-d4a085445b6d
|||+_Title AS System.String = test
|||+_Url AS System.String = test
|||+_UserId AS System.Guid = cf2e5ccc-bd32-405d-bd54-eda112ebe06c
|||+_Link AS System.String = http...
|||+_Description AS System.String = tealkjdlsakj
|||+_CategoryId AS System.Guid = 7bd8028e-02c1-45f4-a0a6-403f5bf0ff0c
|||+_Date AS System.DateTime = 17.04.2008 15:48:53
|||+_EntryTags AS System.Data.Linq.EntitySet`1[[Mvc2.Models.DataObjects.EntryTag, Mvc2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] = System.Data.Linq.EntitySet`1[Mvc2.Models.DataObjects.EntryTag]
|||+_Category AS System.Data.Linq.EntityRef`1[[Mvc2.Models.DataObjects.Category, Mvc2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] = System.Data.Linq.EntityRef`1[Mvc2.Models.DataObjects.Category]
|||+PropertyChanging AS System.ComponentModel.PropertyChangingEventHandler = System.ComponentModel.PropertyChangingEventHandler
|||+(System.MulticastDelegate)
|||+(System.Delegate)
||+[1] AS Mvc2.Models.DataObjects.Entry = Mvc2.Models.DataObjects.Entry
|||+_Id AS System.Guid = 8e1554c1-47fa-4db5-af41-91c3fcf92fb3
|||+_Title AS System.String = EntryTitle
|||+_Url AS System.String = EntryTitle_13
|||+_UserId AS System.Guid = cf2e5ccc-bd32-405d-bd54-eda112ebe06c
|||+_Link AS System.String = http://.../
|||+_Description AS System.String = Blabla
|||+_CategoryId AS System.Guid = 16d09b0a-2157-43b7-a881-b536e90f7fbf
...

Das ist jetzt noch nicht die perfekte Lösung – allerdings zeigt es, wohin es gehen kann und was man damit wunderbares anstellen kann.

Ich hoffe ich schaff es in den nächsten Tagen eine verbesserte Version zu erstellen – RouteData, Parameters etc. müssen ja auch alle geloggt werden – und diese Darstellung ist noch etwas “unpraktisch”. Aber prinzipiell cool ;)

Read more

Zeit für Bürospielchen: "Das traust du dich eh nicht!"

Mit dem Bürospiel “Das traust Du Dich eh nicht” werden wir alle viel mehr Spaß bei der Arbeit haben! Und so geht’s: Nach dem “Das traust Du Dich eh nicht” – Punktesystem gibt es für die nachstehenden Leistungen die genannten Punktezahlen. Wer am Tagesende die meisten Punkte hat, hat gewonnen. 1 Punkt gibt`s hierfür:1. Eine […]

Read more

Wie Social Bookmarking die Zugriffszahlen erhöhen…

Die relativ kurze Liste mit ein paar kostenlosen Icons (welche ich auch auf den englischen Blog veröffentlicht habe) hat mich bereits gestern in erstaunen gesetzt, wie Social Bookmarking Dienste wie del.icio.us, popurls.com oder dzone.com sehr schnell die Zugriffszahlen erhöhen können:   Seit Veröffentlichung ca. 4000 Besuche – für einen sonst unbekannten Blog recht gut – […]

Read more

ASP.NET MVC April CodePlex Source Push

Microsoft hat eine neue Version des MVC Frameworks auf Codeplex released. Update: Scott Guthrie hat nun einige Zeilen zu dem neuen “Release” geschrieben – es ist nicht die MVC Preview 3, sondern eine “Preview” der “Preview” Wie bereits im Forum vom ASP.NET Team angekündigt, wurden die ActionFilter erweitert. Hier die Zusammenfassung von der Codeplex Seite: […]

Read more

Noch mehr beeindruckende Javascript Spielerein

Nachdem Robert schon mal diesen Link gebloggt hat habe ich noch diese coolen Scripts gefunden: 60 More AJAX- and Javascript Solutions For Professional Coding 80+ AJAX-Solutions For Professional Coding und noch eine Liste vieler nützliche Javascriptbibliotheken: AJAX, DHTML and JavaScript Libraries

Read more

Tastenkombos bei Präsentationen sichtbar machen mit dem Key Presenter

Die .Net User Group aus Dortmund(www.Do-DotNet.de) hat ein kleines Tool veröffentlicht welches man einsetzen kann um gedrückte Tasten während einer Präsentation, Screencast… zu visualisieren. Dank dieses Tools können die Zuschauer nachvollziehen welche Tastenkombos benutzt wurden. Das Tool gibt”™s unter: http://www.do-dotnet.de/front_content.php?idcat=7&idart=21 Der Key Presenter und viele andere Themen werden am 25.4 beim Treffen der Usergroup vorgestellt.

Read more

Kostenlos ist beliebt

Die Leute stehen auf kostenlose Sachen: Auf dem englischen Blog habe ich seit gestern über 2.000 Zugriffe – vor allem wegen diesen vielen Linkportalen. 5 Minuten Ruhm \o/

Read more

ASP.NET MVC: Dynamische Daten auf der Master Page

Wer mit der 2 MVC Preview rumspielt, wird sicherlich irgendwann zu der Frage kommen: Wie stell ich dynamische Daten auf meiner Master Page dar oder wenn ich irgendwelche Daten darstellen möchte, die nur indirekt mit dem View was zutun haben. Die Grundstruktur von einer MVC Applikation: Die einzelnen Controller greifen jeweils auf die Views in […]

Read more

[Update] Icons, Icons, Icons… kostenlos!

Gute Icons findet man schwer – daher hab ich ein paar Quellen gesammelt und liste diese mal hier auf – beachtet aber die jeweilige Lizenz: 35 (Really) Incredible Free Icon Sets 20+ Free And Fresh Icon Sets Icons For Your Desktop and Icons For Your Web Designs Freebies Round-Up: Icons, Buttons and Templates FreeIconsDownload FamFamFam […]

Read more

.NET 3.5 Enhancements Training Kit

Microsoft hat ein neues Training Kit rausgebeben: Download hier Zum Inhalt gehören: – ASP.NET MVC – ASP.NET Dynamic Data – ASP.NET AJAX – ASP.NET Silverlight Controls – ADO.NET Data Services – ADO.NET Entity Framework Demos oder viele PPTs sucht man allerdings vergeblich – ein Blick lohnt sich trotzdem. Zum MVC Part kann ich allerdings schon […]

Read more

Letzte Posts

  • image_thumb.png
    NuGet Package Restore & Build Server wie z.B. AppVeyor

    NuGet ist ja mittlerweile weit verbreitet, aber eine Frage stellt sich natürlich immer noch: Checkt man die NuGet Packages ein oder nicht? In meinem kleinen Side-Projekt, welches auf GitHub liegt und ich über AppVeyor auch bauen lasse nutze ich das Package Restore Feature von NuGet, d.h. in meinem Repository befindet sich kein NuGet Package mehr, […]

  • image.png
    Microsoft Account Login via ASP.NET Identity

    Der Microsoft Account ist die zentrale Identifikationsstelle in der “Consumer-Microsoft-Welt”, allerdings ist das Einbinden eben dieser in die eigene Applikation eher schwierig. Das “Live SDK” ist nun unter dem OneDrive Dev Center zu finden und ganz professionell wurden auch alle Links zum alten Live SDK damit unbrauchbar gemacht. Beim Microsoft Account ist es auch unmöglich […]

  • image.png
    Zeitgesteuerte Azure WebJobs – so einfach kann Azure sein

    Das noch in Entwicklung befindliche Azure WebJob SDK bietet einige coole Features zum Verarbeiten und Bereitstellen von Daten. Bekanntes Beispiel ist das Sample welches auf eine Azure Queue lauscht und sobald ein Item da vorhanden ist anfängt dies zu verarbeiten. Szenario: Zeitgesteuerte Aktivitäten – ohne Queue und co. Mein Szenario war allerdings wesentlich trivialer: Ich […]

  • image.png
    Get Involved in OSS! Ja, aber wie geht das denn mit GitHub?

    Auch im .NET Lager gibt es Bewegung im OSS Bereich und es gibt verschiedene Arten wie man bei einem Open Source Projekt “Contributed”. Was zählt alles zu “Contribution”? Unter “Contribution” läuft eigentlich alles – ob es Fragen/Probleme zu dem Projekt via Issues ist oder Dokumentation nachreicht oder ob man darüber bloggt oder das Projekt vorstellt. […]

  • HowTo: Web.config samt eigener ConfigSection zur Laufzeit ändern

    In dem HowTo geht es darum wie man die Web.config zur Laufzeit ändert und was es dabei zu beachten gilt. Das ganze klappt auch mit komplexeren ConfigSections. Eigene ConfigSection? Vor einer ganzen Weile habe ich mal über das Erstellen einer eigenen ConfigSection geschrieben – im Grunde nutzen wir jetzt fast dieselbe Config. Zur Laufzeit? Startet […]

Amazon Shop

Facebook