diff --git a/ASP.NET/README-ASPNET.txt b/ASP.NET/README-ASPNET.txt
new file mode 100644
index 0000000..61702d2
--- /dev/null
+++ b/ASP.NET/README-ASPNET.txt
@@ -0,0 +1,32 @@
+A TINY TUTORIAL
+----------------
+
+NB : You can use Sharrre.ashx in any ASP.NET applications (MVC or WebPages)
+
+ASP.NET Part
+--------------
+
+1) Create a folder "Handlers" in your project (but you can name it whatever you want)
+2) Add Sharrre.ashx in this folder
+3) If you're using MVC 4, add routes.IgnoreRoute("{resource}.ashx/{*pathInfo}"); in your RouteConfig.cs
+4) You'll need two NuGet packages : HtmlAgilityPack and JSON.NET (JSON.NET is now included in all ASP.NET MVC 4 applications)
+
+
+jQuery Configuration Part
+-------------------------
+
+1) Insert your share JS files as usual
+2) Specify "curlUrl". Ex :
+$('#share').sharrre({
+ share: {
+ googlePlus: true,
+ facebook: true,
+ twitter: true
+ },
+ url: 'http://sharrre.com/',
+ urlCurl: '/Handlers/Sharrre.ashx'
+});
+
+3) Have a coffee
+
+
diff --git a/ASP.NET/Sharrre.ashx b/ASP.NET/Sharrre.ashx
new file mode 100644
index 0000000..e70b869
--- /dev/null
+++ b/ASP.NET/Sharrre.ashx
@@ -0,0 +1 @@
+<%@ WebHandler Language="C#" CodeBehind="Sharrre.ashx.cs" Class="Lidd.Handlers.Sharrre" %>
diff --git a/ASP.NET/Sharrre.ashx.cs b/ASP.NET/Sharrre.ashx.cs
new file mode 100644
index 0000000..a1870ba
--- /dev/null
+++ b/ASP.NET/Sharrre.ashx.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Web;
+using System.Xml;
+using HtmlAgilityPack;
+using Newtonsoft.Json;
+
+namespace Sharrre.Handlers
+{
+ ///
+ /// ASP.NET Version of sharrre.php. Please view README-ASPNET.txt.
+ ///
+ public class Sharrre : IHttpHandler
+ {
+
+ private Dictionary resultDictionary;
+
+ public Sharrre()
+ : base()
+ {
+ resultDictionary = new Dictionary();
+ resultDictionary.Add("url", string.Empty);
+ resultDictionary.Add("count", 0);
+ }
+
+ public void ProcessRequest(HttpContext context)
+ {
+ string urlParameter = context.Request.QueryString["url"];
+ string typeParameter = context.Request.QueryString["type"];
+
+ resultDictionary["url"] = urlParameter;
+
+ Uri baseUri;
+ if (Uri.TryCreate(urlParameter, UriKind.Absolute, out baseUri))
+ {
+ switch (typeParameter)
+ {
+ case "googlePlus":
+ GetGoogleInfo(baseUri);
+ break;
+ case "pinterest":
+ GetPinterestInfo(baseUri);
+ break;
+ case "stumbleupon":
+ GetStumbleInfo(baseUri);
+ break;
+ default:
+ throw new NotImplementedException(string.Format("Can't get informations for {0}", typeParameter));
+ }
+
+
+ }
+
+ var contentResult = JsonConvert.SerializeObject(resultDictionary);
+ context.Response.ContentType = "application/json";
+ context.Response.Write(contentResult);
+
+ }
+
+ private void GetStumbleInfo(Uri baseUri)
+ {
+ var stumbleObject = GetJsonObject(string.Format("http://www.stumbleupon.com/services/1.01/badge.getinfo?url={0}", WebUtility.UrlEncode(baseUri.AbsoluteUri)));
+ try
+ {
+ resultDictionary["count"] = stumbleObject.result.views;
+ }
+ catch (Exception)
+ {
+ resultDictionary["count"] = 0;
+ }
+ }
+
+ private void GetPinterestInfo(Uri baseUri)
+ {
+ var pinObject = GetJsonObject(string.Format("http://api.pinterest.com/v1/urls/count.json?callback=&url={0}", WebUtility.UrlEncode(baseUri.AbsoluteUri)), PinterestJsonTransformer);
+ try
+ {
+ resultDictionary["count"] = pinObject.count;
+ }
+ catch (Exception)
+ {
+
+ resultDictionary["count"] = 0;
+ }
+ }
+
+ private string PinterestJsonTransformer(string baseJson)
+ {
+ return baseJson.Replace("(", string.Empty).Replace(")", string.Empty);
+ }
+ private void GetGoogleInfo(Uri baseUri)
+ {
+ var htmlDocument = GetHtmlDocument(string.Format("https://plusone.google.com/u/0/_/+1/fastbutton?url={0}&count=true", WebUtility.UrlEncode(baseUri.AbsoluteUri)));
+ var node = htmlDocument.DocumentNode.SelectSingleNode("//div[@id='aggregateCount']");
+ if (node != null)
+ {
+ resultDictionary["count"] = node.InnerText.Replace(">", string.Empty);
+ }
+ }
+
+ private HtmlDocument GetHtmlDocument(string path)
+ {
+ try
+ {
+ var gplusUrl = string.Format(path);
+ var client = new HtmlWeb();
+ var htmlDocument = client.Load(gplusUrl);
+
+ return htmlDocument;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Trace.TraceError(string.Format("Exception occur in Sharrre handler (GetHtmlDocument) : {0}", ex.ToString()));
+ return new HtmlDocument();
+ }
+ }
+
+ private dynamic GetJsonObject(string path, Func jsonPretransformation = null)
+ {
+ try
+ {
+ WebClient webClient = new WebClient();
+ var result = webClient.DownloadString(path);
+ if (jsonPretransformation != null)
+ {
+ result = jsonPretransformation.Invoke(result);
+ }
+ return JsonConvert.DeserializeObject(result);
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Trace.TraceError(string.Format("Exception occur in Sharrre handler (GetJsonObject) : {0}", ex.ToString()));
+ return JsonConvert.DeserializeObject("{}");
+ }
+ }
+ public bool IsReusable
+ {
+ get
+ {
+ return false;
+ }
+ }
+ }
+}