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.