19 January 2012

reCAPTCHA : Free Captcha service for ASP.NET

What is reCaptcha?
  1. reCAPTCHA is a free CAPTCHA service that helps to digitize books, newspapers and old time radio shows.
  2. It’s Free! Yep, reCAPTCHA is free.
  3. It’s Easy. reCAPTCHA is a Web service. As such, adopting it is as simple as adding
    a few lines of code on your site.
  4. It’s Accessible. reCAPTCHA has an audio test that allows blind people to freely
    navigate your site.
  5. It’s Secure. Most other CAPTCHA implementations can be easily broken.
  6. It’s Popular. Over 100,000 sites use reCAPTCHA, including household names like Facebook, Ticketmaster, and Craigslist.
  7. Whenever uses input data in reCaptcha control, they actually help digitizing books.
Moreover is very easy to integrate reCaptcha in our websites. Below are the steps
which are required to integrate it into a ASP.NET page.
Steps to Integrate reCaptcha in ASP.NET 

Step1:  Register for a reCaptcha key : As a first step we need to register for recaptcha keys. Navigate to Get reCaptcha URL to signup for the keys. After we register for the keys, we get a public and private keys which we need to use in our asp.net page. By default all keys work on localhost as well. 

Step2:  Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project. 
Step3:  Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:
Step4:  At the top of the aspx page, insert this: 
      <%@ Register TagPrefix="recaptcha" Namespace="Recaptcha" Assembly="Recaptcha" %>

Step5:  Then insert the reCAPTCHA control inside of the form tag and Enter your Publickey and PrivateKey
 <recaptcha:RecaptchaControl ID="recaptcha" runat="server" Theme="Red" PublicKey="" PrivateKey="" Height="30px" />
Step6:  Make sure you use ASP.NET validation to validate your form (you should check Page.IsValid on submission)
As an example I created a ASP.NET page whose markup and code behind code looks as given below:
Markup: (.aspx)


<asp:Label  Visible="true" ID="lblResult" runat="server" />
<recaptcha:RecaptchaControl ID="recaptcha" runat="server" Theme="Red" PublicKey="" PrivateKey="" Height="30px" />
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />

Code-behind(.aspx.cs)


protected void  btnSubmit_Click(object sender, EventArgs e)
    {
        recaptcha.Validate();
        if (recaptcha.IsValid)
        {
              if (Page.IsValid)
             {
                   lblResult.Text = "Captcha sucessfull!";
                   lblResult.ForeColor = System.Drawing.Color.Green;
             }
             else
            {
                 lblResult.Text = "Incorrect";
                 lblResult.ForeColor = System.Drawing.Color.Red;
             }
         }
    }

When I entered correct captcha text and pressed submit button following was the output:
 When I entered incorrect captcha text and pressed submit button following was the output:







  1. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:










  2. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:













  3. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  4. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:










  5. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  6. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:










  7. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  8. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:










  9. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  10. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:












  11. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  12. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:







  13. Read more: http://www.techartifact.com/blogs/2011/01/recaptcha-free-captcha-service-for-asp-net.html#ixzz1jsTc1Pwi




  14. Download reCaptcha library for ASP.NET: Download the dll file from here. Also add the reference to the dll in the asp.net project.









  15. Add reCaptcha widget on ASP.NET page : Insert the reCAPTCHA control into the form you wish to protect by adding the following code snippets:






  16. 18 January 2012

    Steps for Session InProc Mode to Session StateServer

    Many articles are discussing about advantages of using Session StateServer or SQLServer over InProc Mode.  One basic reason why I choose StateServer Mode is when your website is running on Third Party Hosting than you will notice that Session Timeout can occur anytime depends on load of traffic on your server.

    If your website has large number of visitors and session timeout can cause problem, It is better to change Session Mode Session="InProc" to Session="StateServer".

    Main Advantage of Session StateServer (Best to choose while hosting on third party server)
    1.  Session is persistent and reliable.
    2. Avoid Session Timeout due to Memory shortage on server (IIS Setting).

    Main Disadvantage
    1. Poor Performance compare to Session="InProc"
    2. Session_End Event would not fire.

    Now lets understand 
    Steps for changing Session InProc Mode to Session StateServer Mode.

    Step 1:  Start Asp.net State Servcie
    1. Go to Control Panel > Administrative Tools > Services 
    2. Select Asp.Net State Service.
    3. Right Click on Asp.net State Service and choose start from popup menu.
     
    If you forget to Start Service you will receive following error.

    Server Error in '/' Application.

    Unable to make the session state request to the session state server. Please ensure that the ASP.NET State service is started and that the client and server ports are the same.  If the server is on a remote machine, please ensure that it accepts remote requests by checking the value of HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection.  If the server is on the local machine, and if the before mentioned registry value does not exist or is set to 0, then the state server connection string must use either 'localhost' or '127.0.0.1' as the server name.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.Web.HttpException: Unable to make the session state request to the session state server. Please ensure that the ASP.NET State service is started and that the client and server ports are the same.  If the server is on a remote machine, please ensure that it accepts remote requests by checking the value of HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection.  If the server is on the local machine, and if the before mentioned registry value does not exist or is set to 0, then the state server connection string must use either 'localhost' or '127.0.0.1' as the server name.



    Step 2:  Change Session Mode in Web.Config File
    <sessionState mode="StateServer"
                stateConnectionString="tcpip=127.0.0.1:42424"
                cookieless="false"
                timeout="120"/>
    Note: You can adjust timeout minutes based on your requirement.  Let the tcpip server to be localhost i.e. 127.0.0.1.  Most webhosting company uses these settings unless you have different IP for StateServer and  You are not required to change Port Number.


    Step 3: Make All Object Serializable
    You should make all object in your website to serializable.
    Note: To take advantage of Session StateServer or SQLServer or Custom Mode, object needs to be serialized.

    Example:  If your project contains class files for creating DAL (Data Access Layer), you should append Serializable to every class definition in order to make class Serializable.
     
    [Serializable]
    Class Department
    {
            long   _deptId;
            string _deptName;
            
            public long DeptId
            {
                   get {   return _deptId; }
                   set {  _deptId = value; }                  
             }

            public string DeptName
            {
                   get {   return _deptName; }
                   set {  _deptName = value; }                  
             }
    }

    IMPORTANT While doing Serialization
    Remember SQLConnection cannot be serialized.

    You might receive following error if you don't handle this situation.

    Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.Web.HttpException: Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.


    So to handle this situation you need to do following thing.

    1. Mark SQLConnection Object as NonSerialized
    [NonSerialized] protected SqlConnection _mainConnection;

    2. Mark your Class as Serializable and derive from IDeserializationCallback
    Example:
    [Serializable]
    Class Department: IDeserializationCallback
    {
            long   _deptId;
            string _deptName;
            
            public long DeptId
            {
                   get {   return _deptId; }
                   set {  _deptId = value; }                  
             }

            public string DeptName
            {
                   get {   return _deptName; }
                   set {  _deptName = value; }                  
             }

            //Create this Method Inside your Class
           void IDeserializationCallback.OnDeserialization(object sender)
            {
                //Recreate your connection here
                _mainConnection = new SqlConnection();
                _mainConnection.ConnectionString =
                        ConfigurationSettings.AppSettings["connStr"].ToString();           
            }
    }
     
    Reference Link: Click Here

    DataView.Table - Problem to Persist Sort or Filter View

    I was trying to Sort data with DataView and was trying to convert Dataview to table. I have notice even though view is sorted, when you try to convert it to table it would return only default sort.

    Example:
    //I was trying to perform something as following
    DataTable dtGrid = GetData();
    DataView dvSort = new DataView(dtGrid);
    dvSort.Sort = "CreationDate DESC";
    dtGrid = dvSort.Table; //Will Not Persist Sort Order

    In above example even though view is in sorted order, when i tried to convert it to table it would return only default view. In order to get Sorted view (Persist Sort order) instead of using DataView.Table you should use DataView.ToTable() method

    So if you changed above code with following it would start working as expected.

    DataTable dtGrid = GetData();
    DataView dvSort = new DataView(dtGrid);
    dvSort.Sort = "CreationDate DESC";
    dtGrid = dvSort.ToTable(); //Persist Sort Order

    Copy of Session Object

    Many times we try to make copy of session object, but in case when we are modifying copied object we might noticed that session object gets updated automatically, the reason is both copied object and session object are pointing to same location, even if you tried to use "new" operator while creating object.

    Scenario
    Let say you have Member Class as mentioned under
    public class Member
    {
            public string FirstName { get; set; }
            public string LastName { get; set; }
    }


    Problem:
    Member objMember = new Member();
    objMember.FirstName = "Sachin";
    objMember.LastName = "Tendulkar";

    Then try to save object in Session
    Session["MemberObj"] = objMember;

    This method will work good till we are just accessing object from session, but in case if we try to update object created from session it will update value of session also. That is,

    Member newMember = new Member(); //Even though object is created using "new" keyword.
    newMember = (Member) Session["MemberObj"];
    newMember.FirstName = "Kapil"; //This will update session FirstName also.

    Solution:
    To make copies of session you need to create a clone method in class. In above class create a method clone, to support copy of session.

    public class Member
    {
    public string FirstName { get; set; }
            public string LastName { get; set; }

    public Member clone()
         {
                Member cloneMember = new Member();
                 cloneMember.FirstName = this.FirstName;
                cloneMember.LastName = this.LastName;
    }
    }

    Now, while accessing session object, you can call clone method to make copy of session.

    Member newMember = new Member();
    newMember = ((Member) Session["MemberObj"]).clone();

    now if you try to modify object copied from session, will not update session object.
    newMember.FirstName = "Kapil"; //Will not update session FirstName

    Reference Link: Clickhere

    13 January 2012

    Extension Methods in C-Sharp

    You want to improve the syntax for calling common methods in your C# program, so that function names are shorter and easier to type. Extension methods provide a way to easily represent static methods as instance methods in the syntax of the C# language, which can be more intuitive and recallable for developers. Here we look at extension methods.


    Example

    Here is a custom extension method defined in a program written in the C# programming language. Generally, you will want to store your extension method class in a separate source file, such as "ExtensionMethods.cs" in your project. The file should store a static class with public static extension methods. In the rest of your source code, you can invoke these extension methods in the same way as you can call instance methods.
    Program that uses extension method on string [C#]
    
    using System;
    
    public static class ExtensionMethods
    {
        public static string UppercaseFirstLetter(this string value)
        {
     //
     // Uppercase the first letter in the string this extension is called on.
     //
     if (value.Length > 0)
     {
         char[] array = value.ToCharArray();
         array[0] = char.ToUpper(array[0]);
         return new string(array);
     }
     return value;
        }
    }
    
    class Program
    {
        static void Main()
        {
     //
     // Use the string extension method on this value.
     //
     string value = "dot net perls";
     value = value.UppercaseFirstLetter(); // Called like an instance method.
     Console.WriteLine(value);
        }
    }
    
    Output
    
    Dot net perls
     
    Description. In the first part of the program text, you can see an extension method declaration in the C# programming language. An extension method must be static and can be public so you can use it anywhere in your source code.
    The extension method is called like an instance method, but is actually a static method. The instance pointer 'this' is received as a parameter. You must specify the 'this' keyword before the appropriate parameter you want the method to be called upon. In the method, you can refer to this parameter by its declared name.

    This-keyword in parameter list. The only difference in the declaration between a regular static method and an extension method is the 'this' keyword in the parameter list. If you want the extension method to received other parameters as well, you can place those in the method signature's parameter list after the 'this' parameter.
    Calling extension method. You can call an extension method in the same way you call an instance method. In Visual Studio, an extension method in IntelliSense is represented by a different icon that has a downward arrow on it. You can use this icon to differentiate between instance and extension methods before calling them. Also the text "(extension)" is used in IntelliSense.
     

    What’s the Specification of an Extension Method?

    An extension method is a special kind of static method that allows you to add new methods to existing types without creating derived types. The extension methods are called as if they were instance methods from the extended type, For example: x is an object from int class and we called it as an instance method in int class.

    How to Create my Extension Method?

    Simply, you create your own static method in your class and put this keyword in front of the first parameter in this method (the type that will be extended).

    General Tips in Extension Methods Usage

    This section is optional reading section for understanding the core idea of extension methods:
    1. This keyword has to be the first parameter in the extension method parameter list.
    2. Extension methods are used extensively in C# 3.0 and further version specially for LINQ extensions in C#, for example:
    3. It is important to note that extension methods can't access the private methods in the extended type.
    4. If you want to add new methods to a type, you don't have the source code for it, the ideal solution is to use and implement extension methods of that type.
    5. If you create extension methods that have the same signature methods inside the type you are extending, then the extension methods will never be called.