Owin ist eine interessante Sache um Web-Anwendungen zu schreiben, die von beliebigen .NET basierenden Webservern gehostet werden können. Eine Einschränkung auf den IIS ist nicht gegeben (was dann auch diverse Handler-Implementierungen betrifft). Ich setze in der letzten Zeit auf Owin, zumal ich immer seltener via IIS hoste und mir auch eben diese Abhängigkeit nicht gefällt. Dieser Beitrag zeigt, wie Owin einfach um eine Middleware erweitert werden kann.

Owin ist eine interessante Sache um Web-Anwendungen zu schreiben, die von beliebigen .NET basierenden Webservern gehostet werden können. Eine Einschränkung auf den IIS ist nicht gegeben (was dann auch diverse Handler-Implementierungen betrifft). Ich setze in der letzten Zeit auf Owin, zumal ich immer seltener via IIS hoste und mir auch eben diese Abhängigkeit nicht gefällt.

Die öffentliche Definition von Owin lautet:

OWIN defines a standard interface between .NET web servers and web applications. The goal of the OWIN interface is to decouple server and application, encourage the development of simple modules for .NET web development, and, by being an open standard, stimulate the open source ecosystem of .NET web development tools.

Owin unterstützt hier die Möglichkeit in die Request Pipeline einzugreifen, nennen wir es die Owin Middleware. Als Basis-Klasse steht OwinMiddleware zur Verfügung.

In meinem Fall wollte ich über log4net Informationen über Request als auch Response loggen. Die Implementierung ist nachfolgend zu sehen.

Zu beachten ist, dass die Klasse LogFactory eine eigene Implementierung darstellt und lediglich log4net kapselt.

internal class RequestLoggerMiddleware : OwinMiddleware
{
    // LogFactory is a fluent implemention of log4net
    private readonly Log log = LogFactory.Create(typeof (RequestLoggerMiddleware));

    public RequestLoggerMiddleware(OwinMiddleware next)
        :base(next)
    {
    }

    public override async Task Invoke(IOwinContext context)
    {
        var method = string.Empty;
        var path = string.Empty;
        var statusCode = string.Empty;

        // Request
        if (context.Request != null)
        {
            method = context.Request.Method;
            path = context.Request.Path.ToString();
        }

        log.WithMessage(string.Format("METHOD: {0} - PATH: {1}", method, path)).AsDebug();

        // Invoking everything else
        await Next.Invoke(context);

        // Response
        if (context.Response != null)
        {
            statusCode = context.Response.StatusCode.ToString();
        }

        log.WithMessage(string.Format("METHOD: {0} - PATH: {1} - STATUSCODE: {2}", method, path, statusCode)).AsDebug();
    }
}

In Startup für Owin muss die Middleware noch konfiguriert werden:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();

        // defines routes
        // define filters

        app.Use<RequestLoggerMiddleware>();

        app.UseWebApi(config);

        // do other important stuff
    }
}

Dieses Prinzip kann natürlich einfach auf unterschiedlichste Anforderungen angewandt werden.

Über den Autor

Norbert Eder

Ich bin ein leidenschaftlicher Softwareentwickler und Fotograf. Mein Wissen und meine Gedanken teile ich nicht nur hier im Blog, sondern auch in Fachartikeln und Büchern.