Monday, July 1, 2013

CREATE CUSTOM HTTP HANDLER in Mvc Application based on Xml Rules

CREATE CUSTOM HTTP HANDLER in Mvc Application based on Xml File Rules

Creating Handler for Mvc Application, Deserialize Rules Xml and Invoke Relevant Contoller / Action




public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
            var virtualPath = HttpContext.Current.Request.CurrentExecutionFilePath.TrimStart('/');

            var routeInfo = RoutesBus.GetIdByRoute(virtualPath);

            if (routeInfo == null)
            {
                return new MvcHandler(requestContext);
            }

            var latestRouteInfo = RoutesBus.GetRouteById(routeInfo.Route_RelatedID, routeInfo.Route_RelatedType);

            if (latestRouteInfo == null)
            {
                return new MvcHandler(requestContext);
            }

            if (routeInfo.RouteURL != latestRouteInfo.RouteURL)
            {
                HttpContext.Current.Response.Status = "301 Moved Permanently";
                HttpContext.Current.Response.StatusCode = 301;
                HttpContext.Current.Response.RedirectLocation = '/' + latestRouteInfo.Route_EntireURL;
                HttpContext.Current.Response.End();
            }

            var showPageTypeControllerRules = Utilities.SerializationHelper.Desirialization<rules>
                                                                                                                                (ShowPageTypeControllerRulesXml);
            Utilities.RouteFactoryByPageType.GetRouteDataAccordingToShowPageRules(requestContext, 
                                                                                                                           showPageTypeControllerRules, routeInfo);

            return new MvcHandler(requestContext);
}

... Desirialization (trivial, but anyway)

public class SerializationHelper
    {
        public static T Desirialization<T>(string filePath)
        {
            var serializer = new XmlSerializer(typeof(T));
            var reader = new StreamReader(filePath);
            var result = (T)serializer.Deserialize(reader);
            reader.Close();
            return result;
        }

    }

AND GetRouteDataAccordingToShowPageRules And Invoke Relevant Controller

public static void GetRouteDataAccordingToShowPageRules
(RequestContext requestContext, rules showPageTypeControllerRules, RouteInfoObject routeInfo)
{
            var relevantRule = (from r in showPageTypeControllerRules.Items where r.name == routeInfo.Route_RelatedType  
                                              select r).FirstOrDefault();

            if (relevantRule == null) return;

            requestContext.RouteData.Values["controller"] = relevantRule.controller;
            requestContext.RouteData.Values["action"] = relevantRule.action;
            requestContext.RouteData.Values["eventId"] = routeInfo.Route_RelatedID;

 }

No comments:

Post a Comment