Showing posts tagged asp.net

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.

Uploading an image with AWS SDK for .Net (C#)

I recently started using cloud-based hosting (AppHarbor.com) for my latest project (Mealtik.com) and I needed a remote storage solution for the images that would be uploaded by users. I was already familiar with Amazon’s Simple Storage service (AWS S3), but never actually built a .Net app that used this API for uploading images to S3.

So…here are the steps to simply get an image published\uploaded to S3.

1. First go get an account with AWS at http://aws.amazon.com/ and then go get your accessKey and SecretKey from your account.

2. Download the AWS SDK for .Net here: http://aws.amazon.com/sdkfornet/ and include the assembly AWSSDK.dll in your project.

3. Here’s the markup:
     <input type=”file” id=”fileUpload” name=”fileUpload” size=”23” />

4. Here’s the C#:


HttpPostedFileBase file = Request.Files[0];
if (file.ContentLength > 0) // accept the file
{
string accessKey = "XXXXXXXXXXX";
string secretKey = "122334XXXXXXXXXX";
AmazonS3 client;

using (client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey))
{
PutObjectRequest request = new PutObjectRequest();
request.WithBucketName("mealtik")
.WithCannedACL(S3CannedACL.PublicRead)
.WithKey("meals/test.jpg").InputStream = file.InputStream;
S3Response response = client.PutObject(request);
}
}



A few things to point out:
  1. I’m uploading my image (“test.jpg”) to folder (“meals”) which is in a bucket called “mealtik”.
  2. I’m setting the image permissions to “public read”.
  3. I’m using MVC, but the code should work for webforms as well.

As you can see, it’s pretty simple to do, but for some reason I couldn’t find an example of this anywhere on the interwebs. Hope this helps!

Fork me on GitHub