Using CloudMine to log PageViews with ASP.Net MVC
I’ve used a few services in the past to do site “event tracking” (ie Google Analytics) but most didn’t give me all the data and control I need to easily track what was needed… (mostly user identity stuff). Another big difference is that this is all done server-side, which has it’s pros\cons as well.
Anyway, here’s how I did it using CloudMine’s backend service in ~20 lines of code.
Step1. Add this Action Filter to your MVC application (ie Global.asax.cs)
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class UserTrackingAttribute : ActionFilterAttribute
{
public static readonly string appId = "your CloudMine app Id";
public static readonly string appSecret = "your CloudMine app Secret";
class PageRequest
{
public int PageId { get; set; }
public Double Created { get; set; }
public string Url { get; set; }
public string UserName { get; set; }
public string UserIP { get; set; }
public string Controller { get; set; }
public string Action { get; set; }
}
public override void OnResultExecuting(ResultExecutingContext context)
{
PageRequest preq = new PageRequest
{
Url = request.RawUrl,
UserIP = request.UserHostAddress,
UserName = context.HttpContext.User.Identity.Name,
Created = ExtensionMethods.JsonDate(DateTime.Now),
Action = (string)context.RequestContext.RouteData.Values["action"],
Controller = (string)context.RouteData.Values["controller"],
PageId = Convert.ToInt32(context.RouteData.Values["Id"]),
};
using (var client = new WebClient())
{
client.Headers.Add("X-CloudMine-ApiKey", appSecret);
client.Headers.Add("Content-Type", "application/json");
var serializer = new JavaScriptSerializer();
var data = serializer.Serialize(preq);
var payload = "{\"PV_" + DateTime.Now.Ticks + "\":" + data + "}";
var bytes = Encoding.Default.GetBytes(payload);
client.UploadDataAsync(new Uri("https://api.cloudmine.me/v1/app/" + appId + "/text"), "PUT", bytes);
}
}
Then… just add the filter attribute [UserTracking] to any controller action and you’re ready to start logging…in real-time.
The full example project is on my GitHub…so go fork it.