Tuesday, May 3, 2011

Trick to create separate .cs file for global.asax file and using JavaScript to redirect to custom error page for unauthorized users (code 401)

There is no way to create a global.asax.cs page in vs 2008 or older versions of Visual studio. So we have a work around.

1. Add Global.asax file to your project, notice it won’t let you put the code in separate .cs file.

2. Add a new code file to your project "Global.cs". It will ask you to put the file in App_Code folder (Important step).You click "Yes" which will put the file in App_code folder.


3. Now open the global.cs file you just created and add
using System.Web.Configration;
4. Inherit the Global class from System.Web.HttpApplication like
public class Global : System.Web.HttpApplication

5. Now go back to your old Global.asax file and copy everything inside <Script> tag to this Global.cs file.
6. In Global.asax add Inherit property in Application tag to point to this new code file, remove everything from Global.asax file but only one line is left
<%@ Application Language="C#"  Inherits="Global" %> 

7. Inherits tag in the above line points to the .cs file we are using "Global"
8. You should be good to go and use the Global.cs file without any problem.


Now to create a custom error page for Unauthorized users (code 401/ code 401.2) simply add Application_EndRequest() function in Global.cs page and use JavaScript code to redirect self to custom error page by trapping the 401 Unauthorized code.
1. Create a custom error Page ( E.g. CustomError.cs)
2. Create authorization tag in web.config file to deny or allow users.
3. If the user’s access is denied the Application_EndRequest() function will try to capture the Context Response. We can all kinds of response like error code 401, 402, 404 for my example I am using 401.
4. If the code is indeed 401 (we only look for first 3 letters of the Response status ignoring all the other detail) we redirect the user to the custom error page with this line of code.
context.Response.Write("<script language=javascript>self.location='CustomError.aspx';</script>");
5. So the whole function will look like this:
protected void Application_EndRequest(Object sender, EventArgs e)
{
   HttpContext context = HttpContext.Current;
   if (context.Response.Status.Substring(0, 3).Equals("401"))
   {
      context.Response.ClearContent();
      context.Response.Write("<script  
      language=javascript>self.location='CustomError.aspx'; </script>");
    }
 }


6. You have successfully created a custom code file for Global.asax as well as created a custom error page for unauthorized users.

RootComponent types in solution.xml file in Dynamics CRM 365/2016

In Microsoft Dynamic CRM 2016/365 are you as confused as me when looking at the solution.xml from the solution export? looking at the xml a...