Wednesday, November 27, 2013

Handling Dynamic Subdomains in ASP.NET MVC

I was doing some research work on implementing dynamic subdomains in an ASP.NET MVC, and I found an interesting article which explains the routing functionality and a trick to test it on local environment:

http://ryanmichaelwilliams.com/articles/2012/11/15/dynamic-sub-domains-in-asp-net-mvc

Thursday, November 14, 2013

Get Twitter Feeds

Twitter has recently changed the way to access the feeds for some security reason.  The old simple way of accessing it through RSS has been depicted.  The new method has few additional steps before you can access your precious tweets. 

Before accessing the tweets, you need to register your twitter account and get their API keys here:


Basically 4 keys are needed:
  1. Token
  2. TokenSecret
  3. ConsumerKey
  4. ConsumerSecret

public string GetTwitterFeed()
        {
            try
            {
                string q = "twitterName";
                string resource_url = "https://api.twitter.com/1.1/statuses/user_timeline.json";

                var oauth_token = ConfigurationManager.AppSettings["twitterAccessToken"];
                var oauth_token_secret = ConfigurationManager.AppSettings["twitterAccessTokenSecret"];
                var oauth_consumer_key = ConfigurationManager.AppSettings["twitterConsumerKey"];
                var oauth_consumer_secret = ConfigurationManager.AppSettings["twitterConsumerSecret"];

                // oauth implementation details
                var oauth_version = "1.0";
                var oauth_signature_method = "HMAC-SHA1";

                // unique request details
                var oauth_nonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
                var timeSpan = DateTime.UtcNow
                    - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
                var oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();


                // create oauth signature
                var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
                                "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}&q={6}";

                var baseString = string.Format(baseFormat,
                                            oauth_consumer_key,
                                            oauth_nonce,
                                            oauth_signature_method,
                                            oauth_timestamp,
                                            oauth_token,
                                            oauth_version,
                                            Uri.EscapeDataString(q)
                                            );

                baseString = string.Concat("GET&", Uri.EscapeDataString(resource_url), "&", Uri.EscapeDataString(baseString));

                var compositeKey = string.Concat(Uri.EscapeDataString(oauth_consumer_secret),
                                        "&", Uri.EscapeDataString(oauth_token_secret));

                string oauth_signature;
                using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)))
                {
                    oauth_signature = Convert.ToBase64String(
                        hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)));
                }

                // create the request header
                var headerFormat = "OAuth oauth_nonce=\"{0}\", oauth_signature_method=\"{1}\", " +
                                   "oauth_timestamp=\"{2}\", oauth_consumer_key=\"{3}\", " +
                                   "oauth_token=\"{4}\", oauth_signature=\"{5}\", " +
                                   "oauth_version=\"{6}\"";

                var authHeader = string.Format(headerFormat,
                                        Uri.EscapeDataString(oauth_nonce),
                                        Uri.EscapeDataString(oauth_signature_method),
                                        Uri.EscapeDataString(oauth_timestamp),
                                        Uri.EscapeDataString(oauth_consumer_key),
                                        Uri.EscapeDataString(oauth_token),
                                        Uri.EscapeDataString(oauth_signature),
                                        Uri.EscapeDataString(oauth_version)
                                );



                ServicePointManager.Expect100Continue = false;

                // make the request
                var postBody = "q=" + Uri.EscapeDataString(q);//
                resource_url += "?" + postBody;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url);
                request.Headers.Add("Authorization", authHeader);
                request.Method = "GET";
                request.ContentType = "application/x-www-form-urlencoded";
                var response = (HttpWebResponse)request.GetResponse();
                var reader = new StreamReader(response.GetResponseStream());
                var objText = reader.ReadToEnd();
                //myDiv.InnerHtml = objText;/**/


                JArray jsonDat = JArray.Parse(objText);
                return Convert.ToString(jsonDat[0]["text"]);

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



The code above would fetch only one feed out of the list of feeds obtained.  The code highlighted in the bold text can be changed to fetch more tweets.

ASP.NET Force HTTPS for all the pages of website

Most of the secured sites have a scenario of permanently redirecting to HTTPS protocol, even if the user tries to access it through HTTP.  

You can easily achieve this by adding a small piece of code in your Application_BeginRequest event in Global.asax file.

  protected void Application_BeginRequest(Object sender, EventArgs e)
        {
            if (ConfigurationManager.AppSettings["HTTPS"] == "1" && HttpContext.Current.Request.IsSecureConnection.Equals(false) && HttpContext.Current.Request.IsLocal.Equals(false))
            {
                Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"] + HttpContext.Current.Request.RawUrl);
            }
        }


The Above code would exclude HTTPS redirection for local environment i.e. localhost too.