How to Log All WebAPI Request Response at ASP.NET MVC
2014/05/312 min read
bookmark this
Table of Contents
Introduction
This post demonstrates how to log every request, response, and exception when accessing an ASP.NET MVC 3 controller using a custom ActionFilterAttribute.
Example of Log WebAPI MVC3 Controller
The following code creates a LogFilterAttribute that captures request parameters, URLs, headers, and response status codes for every controller action.
public class LogFilterAttribute : ActionFilterAttribute
{
ILog _log;
public LogFilterAttribute()
: this(null)
{
}
public LogFilterAttribute(ILog log)
{
// TODO: define default ILog Service
//_log = log ?? SomekindOfDefaultLogService()
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string controllerNamespace = string.Format("{0} {1}Controller.{2} {3}",
filterContext.HttpContext.Request.HttpMethod,
filterContext.ActionDescriptor.ControllerDescriptor.ControllerName,
filterContext.ActionDescriptor.ActionName, "Request");
var requestObject = new
{
Request = new
{
Parameters = JsonConvert.SerializeObject(filterContext.ActionParameters),
Url = filterContext.HttpContext.Request.RawUrl,
Headers = JsonConvert.SerializeObject(filterContext.HttpContext.Request.Headers)
}
};
_log.Save(controllerNamespace, JsonConvert.SerializeObject(requestObject));
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
string controllerNamespace = string.Format("{0}Controller.{1} {2}", filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, "Response");
var reponseObject = new
{
Response = new
{
StatusCode = filterContext.HttpContext.Response.StatusCode,
StatusDescription = filterContext.HttpContext.Response.StatusDescription,
Exception = JsonConvert.SerializeObject(filterContext.Exception)
}
};
if (filterContext.Exception != null)
{
controllerNamespace = controllerNamespace + " Exception";
}
_log.Save(controllerNamespace, JsonConvert.SerializeObject(reponseObject));
base.OnActionExecuted(filterContext);
}
}
Conclusion
By using a custom ActionFilterAttribute, you can easily log all WebAPI requests and responses in your ASP.NET MVC application. This approach captures request parameters, URLs, headers, response status codes, and any exceptions that occur during controller action execution.