/// <summary> /// Handle 404 exception and redirect it to the 404 error page, and fallback to NotFoundError view /// </summary> /// <param name="filterContext"></param> protected override void OnException(ExceptionContext filterContext) { //handle 404 exception if (filterContext.Exception is HttpException) { HttpException httpException = filterContext.Exception as HttpException; if (httpException.GetHttpCode() == 404) { filterContext.HttpContext.Response.StatusCode = 404; //add 404 page handling specified by url map string error404PageId = _PageFactory.UrlMap .ToNullHelper() .Propagate( urlMap => urlMap.Error404PageId) .Return(string.Empty); if (!string.IsNullOrEmpty(error404PageId)) { CMSPageRequest page404 = _PageFactory.GetPage(Request, error404PageId) as CMSPageRequest; if (page404 != null && page404.Exists) { filterContext.ExceptionHandled = true; ActionResult result404 = viewOrXsltFallback(page404); result404.ExecuteResult(ControllerContext); return; } } //go to provided Error view, structured url map 404 page is not used, only if the view exists //otherwise, use base procedure ViewResult viewResult = View("NotFoundError", new Error404() { Title = Ingeniux.Runtime.Properties.Resources.Error404Title, BodyCopy = Ingeniux.Runtime.Properties.Resources.Error404BodyCopy, Factory = _PageFactory }); ViewEngineResult viewEngineResult = viewResult.ViewEngineCollection.FindView(ControllerContext, viewResult.ViewName, viewResult.MasterName); if (viewEngineResult != null && viewEngineResult.View != null && viewEngineResult.ViewEngine != null) { filterContext.ExceptionHandled = true; viewResult.ExecuteResult(ControllerContext); return; } } } base.OnException(filterContext); }
public PageModel GetPage(string pageUrl = "/") { //System.Diagnostics.Debugger.Launch(); if (!pageUrl.StartsWith("/") && !pageUrl.IsXId()) { pageUrl = $"/{pageUrl}"; } string sitePath = CmsRoute.GetSitePath(); var context = new HttpContextWrapper(HttpContext.Current); HttpRequestBase _request = context.Request; CMSPageFactory pageFactory = new CMSPageFactory(sitePath); ICMSPage page; if (!pageUrl.IsXId()) { page = pageFactory.GetPageByPath(_request, pageUrl) as ICMSPage; } else { page = pageFactory.GetPage(_request, pageUrl) as ICMSPage; } if (page == null) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "this item does not exist")); } Request.Properties[IGXWebApiCacheAttribute.NAVS_CACHED_PROP_NAME] = (page as CMSPageRequest).NavigationUsingCacheContent; var eleExceptions = new ElementModel().ElementExceptionList; var attrExceptions = new ElementModel().AttributeExceptionList; var pageModel = new PageModel() { Attributes = page .Attributes() .Where(pageAttrs => !attrExceptions.Contains(pageAttrs.AttributeName)) .ToDictionary(pageAttrs => pageAttrs.AttributeName, pageAttrs => pageAttrs.Value), Elements = page .Elements() .Select(e => new ElementModel(e)).Where(e => !eleExceptions.Contains(e.Name)) }; pageModel.Attributes.Add("TestTime", System.DateTime.Now.ToString()); return(pageModel); }
protected override void Initialize(System.Web.Routing.RequestContext requestContext) { base.Initialize(requestContext); _SitePath = CmsRoute.GetSitePath(); _DTSitePath = ConfigurationManager.AppSettings["DesignTimeAssetsLocation"] .ToNullOrEmptyHelper() .Return(_SitePath); _AllowTfrm = ConfigurationManager.AppSettings["EnableTFRMParameter"].ToNullHelper().Branch( str => str.Trim().ToLowerInvariant() == "true", () => true); _LegacyTransformation = ConfigurationManager.AppSettings["LegacyRendering"].ToNullHelper() .Branch( str => str.Trim().ToLowerInvariant() != "false", () => true); _UseTempStylesheetsLocation = ConfigurationManager.AppSettings["UseTempStylesheetsLocation"].ToNullHelper().Branch(str => str.Trim().ToLowerInvariant() != "false", () => true); _IsDesignTime = Reference.Reference.IsDesignTime(_SitePath); try { //page factory is a cheap object to construct, since both surl map and ssmap are cached most time _PageFactory = CMSPageFactoryHelper.GetPageFactory(_IsDesignTime, _SitePath, requestContext, _LegacyTransformation, out _IsDTAuthenticated) as CMSPageFactory; } catch (Ingeniux.CMS.Exceptions.LicensingException e) { if (e.Expired) { _InvalidPageResult = new XmlResult( new XElement("TrialLicenseExpired", new XAttribute("ExpirationDateUTC", e.ExpirationDate.ToIso8601DateString(true)), new XElement("IngeniuxSupport", new XAttribute("Phone", "1.877.299.8900"), new XAttribute("Email", "*****@*****.**"), new XAttribute("Portal", "http://support.ingeniux.com/")))); } else { _InvalidPageResult = new XmlResult( new XElement("InvalidCMSLicense", new XElement("IngeniuxSupport", new XAttribute("Phone", "1.877.299.8900"), new XAttribute("Email", "*****@*****.**"), new XAttribute("Portal", "http://support.ingeniux.com/")))); } } if (_InvalidPageResult == null) { if (_PageFactory.CacheSiteControls) { // only set site control schemas when list is not empty string[] siteControlSchemas = ConfigurationManager.AppSettings["SiteControlSchemas"].ToNullHelper().Branch <string[]>( str => str.Split(';').Select( s => s.Trim()).Where( s => s != "").ToArray(), () => new string[] { }); if (siteControlSchemas.Length > 0) { _PageFactory.SiteControlSchemas = siteControlSchemas; } } _PageFactory.LocalExportsIncludeLinks = ConfigurationManager.AppSettings["LocalExportsIncludeLinks"].ToNullHelper().Branch <bool>( str => str.Trim().ToLowerInvariant() == "true", () => true); //move page getting to here so it can be used to OnActionExecuting try { _CMSPageRoutingRequest = _PageFactory.GetPage(Request, false); } catch (DesignTimeInvalidPageIDException exp) { //this message is exclusive to design time and need to present a special page _InvalidPageResult = new XmlResult(new XElement("DynamicPreviewError", exp.Message)); } } if (_CMSPageRoutingRequest != null && string.IsNullOrWhiteSpace(_CMSPageRoutingRequest.RemaingPath)) { HttpContext.Items["PageRequest"] = _CMSPageRoutingRequest; } }
public override RouteData GetRouteData(HttpContextBase httpContext) { if (string.IsNullOrWhiteSpace(_BaseController)) { _BaseController = ConfigurationManager.AppSettings["BaseControllerName"] .ToNullOrEmptyHelper() .Return(DEFAULT_CONTROLLER_NAME); } ICMSRequest pageRequest = null; RouteData data = null; string action = defaultAction; string controller = _BaseController; string appPath = httpContext.Request.ApplicationPath; if (appPath == "/") { appPath = string.Empty; } string relativePath = httpContext.Request.Path.Substring(appPath.Length).ToLowerInvariant(); if (relativePath.StartsWith("/igxdtpreview")) { pageRequest = _PageFactory.GetPreviewPage(httpContext.Request, true); // because the preview does not get a url, but rather an id and xml, // it is not possible to look for other actions based on the URL action = "Preview"; locateController(pageRequest, ref controller); data = createRouteData(action, controller); } if (relativePath.StartsWith("/igxdynamicpreview") || _PageFactory == null) { action = "DynamicPreview"; try { CMS.IContentStore contentStore = CMSPageFactoryHelper.GetPreviewContentStore(httpContext.Request.RequestContext, _SitePath); CMS.IReadonlyUser currentUser = CMSPageFactoryHelper.GetPreviewCurrentUser(contentStore, httpContext.Request.RequestContext, httpContext.Session); _PageFactory = new DocumentPreviewPageFactory(contentStore, currentUser, _SitePath); _PageFactory.CacheSiteControls = false; pageRequest = _PageFactory.GetDynamicPreviewPage(httpContext.Request, true, true); // because the preview does not get a url, but rather an id and xml, // it is not possible to look for other actions based on the URL locateController(pageRequest, ref controller); } catch { controller = "CMSPageDefault"; } data = createRouteData(action, controller); } else { //only need the schema data, not the whole page ICMSRoutingRequest routingRequest = _PageFactory.GetPage(httpContext.Request, true); if (routingRequest != null && routingRequest.CMSRequest != null && routingRequest.CMSRequest.Exists) { pageRequest = routingRequest.CMSRequest; if (pageRequest != null) { //use default controller for routing request if (pageRequest is CMSPageRedirectRequest) { data = createRouteData(defaultAction, controller); } else { var matchingController = locateController(pageRequest, ref controller); if (!string.IsNullOrEmpty(routingRequest.RemaingPath.Trim('/'))) { //use the first section of the remaining path as action, this is arbitrary. string actionInPath = routingRequest.RemaingPath.Trim('/').SubstringBefore("/"); //if the controller doesn't have this action, use default action action = matchingController.ToNullHelper() .Propagate( c => c.ActionNames .Where(an => an.ToLowerInvariant() == actionInPath.ToLowerInvariant()) .FirstOrDefault()) .Return(defaultAction); //get the remaining path in the controller action itself } else { action = defaultAction; } data = createRouteData(action, controller); } } else { data = createRouteData(defaultAction, controller); } } else { data = createRouteData(defaultAction, controller); } } return(data); }
protected ActionResult handleRequest(Func <ICMSRoutingRequest, ActionResult> nonCmsRouteHandle, Func <CMSPageRequest, string, ActionResult> remainingPathHandle, Func <CMSPageRequest, ActionResult> standardCmsPageHandle) { if (_AllowTfrm) { //exception for settings.xml and urlmap.xml, allow them to display only if string path = Request.Url.AbsolutePath.ToLower(); if (path.EndsWith("settings/settings.xml") || path.EndsWith("settings/urlmap.xml")) { var relativePath = path.Substring(Request.ApplicationPath.Length); string filePath = Path.Combine(_SitePath, relativePath.TrimStart('/').Replace("/", @"\")); if (System.IO.File.Exists(filePath)) { return(new XmlResult(XDocument.Load(filePath))); } } } try { _CMSPageRoutingRequest = _PageFactory.GetPage(Request, false); } catch (DesignTimeInvalidPageIDException exp) { //this message is exclusive to design time and need to present a special page return(new XmlResult(new XElement("DynamicPreviewError", exp.Message))); } if (_CMSPageRoutingRequest.CMSRequest == null || !_CMSPageRoutingRequest.CMSRequest.Exists) { return(nonCmsRouteHandle(_CMSPageRoutingRequest)); } ICMSRequest cmsRequest = _CMSPageRoutingRequest.CMSRequest; //if the request is for redirection, do redirect if (cmsRequest is CMSPageRedirectRequest) { var cmsRedir = cmsRequest as CMSPageRedirectRequest; //string absoluteUrl = cmsRedir.FinalUrl.ToAbsoluteUrl(); string absoluteUrl = cmsRedir.FinalUrl; if (!absoluteUrl.StartsWith("http://") && !absoluteUrl.StartsWith("https://")) { absoluteUrl = VirtualPathUtility.ToAbsolute("~/" + absoluteUrl.TrimStart('/')); } if (cmsRedir.NoRedirectCache) { Response.Expires = -1; Response.Cache.SetCacheability(HttpCacheability.NoCache); } if (cmsRedir.IsPermanent) { Response.RedirectPermanent(absoluteUrl); } else { Response.Redirect(absoluteUrl); } return(null); } else if (cmsRequest is CMSPageRequest) { CMSPageRequest pageRequest = cmsRequest as CMSPageRequest; //first handle requests with remaining path, if the method doesn't return any result, proceed //to treat it as a standard CMS page string remainigPath = _CMSPageRoutingRequest.RemaingPath; if (!string.IsNullOrEmpty(remainigPath)) { ActionResult cmsWithRemainingPathResult = remainingPathHandle(pageRequest, remainigPath); if (cmsWithRemainingPathResult != null) { return(cmsWithRemainingPathResult); } } if (pageRequest.RestrictedAccess) { disableClientSideCaching(); } return(standardCmsPageHandle(pageRequest)); } else { throw new HttpException(501, Ingeniux.Runtime.Properties.Resources.RequestTypeNotRecognized); } }