public override void Initialize() { base.Initialize(); //create the module _module = new UmbracoModule(); SettingsForTests.ConfigurationStatus = UmbracoVersion.Current.ToString(3); //SettingsForTests.ReservedPaths = "~/umbraco,~/install/"; //SettingsForTests.ReservedUrls = "~/config/splashes/booting.aspx,~/install/default.aspx,~/config/splashes/noNodes.aspx,~/VSEnterpriseHelper.axd"; //create the not found handlers config using (var sw = File.CreateText(Umbraco.Core.IO.IOHelper.MapPath(Umbraco.Core.IO.SystemFiles.NotFoundhandlersConfig, false))) { sw.Write(@"<NotFoundHandlers> <notFound assembly='umbraco' type='SearchForAlias' /> <notFound assembly='umbraco' type='SearchForTemplate'/> <notFound assembly='umbraco' type='SearchForProfile'/> <notFound assembly='umbraco' type='handle404'/> </NotFoundHandlers>"); } }
/// <summary> /// Processes the Umbraco Request /// </summary> /// <param name="httpContext"></param> /// <remarks> /// /// This will check if we are trying to route to the default back office page (i.e. ~/Umbraco/ or ~/Umbraco or ~/Umbraco/Default ) /// and ensure that the MVC handler executes for that. This is required because the route for /Umbraco will never execute because /// files/folders exist there and we cannot set the RouteCollection.RouteExistingFiles = true since that will muck a lot of other things up. /// So we handle it here and explicitly execute the MVC controller. /// /// </remarks> void ProcessRequest(HttpContextBase httpContext) { // do not process if client-side request if (httpContext.Request.Url.IsClientSideRequest()) { return; } if (Current.UmbracoContext == null) { throw new InvalidOperationException("The Current.UmbracoContext is null, ProcessRequest cannot proceed unless there is a current UmbracoContext"); } var umbracoContext = Current.UmbracoContext; // re-write for the default back office path if (httpContext.Request.Url.IsDefaultBackOfficeRequest(_globalSettings)) { if (EnsureRuntime(httpContext, umbracoContext.OriginalRequestUrl)) { RewriteToBackOfficeHandler(httpContext); } return; } // do not process if this request is not a front-end routable page var isRoutableAttempt = EnsureUmbracoRoutablePage(umbracoContext, httpContext); // raise event here UmbracoModule.OnRouteAttempt(this, new RoutableAttemptEventArgs(isRoutableAttempt.Result, umbracoContext, httpContext)); if (isRoutableAttempt.Success == false) { return; } httpContext.Trace.Write("UmbracoModule", "Umbraco request confirmed"); // ok, process // note: requestModule.UmbracoRewrite also did some stripping of &umbPage // from the querystring... that was in v3.x to fix some issues with pre-forms // auth. Paul Sterling confirmed in Jan. 2013 that we can get rid of it. // instantiate, prepare and process the published content request // important to use CleanedUmbracoUrl - lowercase path-only version of the current URL var request = _publishedRouter.CreateRequest(umbracoContext); umbracoContext.PublishedRequest = request; _publishedRouter.PrepareRequest(request); // HandleHttpResponseStatus returns a value indicating that the request should // not be processed any further, eg because it has been redirect. then, exit. if (UmbracoModule.HandleHttpResponseStatus(httpContext, request, _logger)) { return; } if (request.HasPublishedContent == false) { httpContext.RemapHandler(new PublishedContentNotFoundHandler()); } else { RewriteToUmbracoHandler(httpContext, request); } }
/// <summary> /// Initialize the module, this will trigger for each new application /// and there may be more than 1 application per application domain /// </summary> /// <param name="app"></param> public void Init(HttpApplication app) { if (_runtime.Level == RuntimeLevel.BootFailed) { // there's nothing we can do really app.BeginRequest += (sender, args) => { // would love to avoid throwing, and instead display a customized Umbraco 500 // page - however if we don't throw here, something else might go wrong, and // it's this later exception that would be reported. could not figure out how // to prevent it, either with httpContext.Response.End() or .ApplicationInstance // .CompleteRequest() // also, if something goes wrong with our DI setup, the logging subsystem may // not even kick in, so here we try to give as much detail as possible BootFailedException.Rethrow(Core.Composing.Current.RuntimeState.BootFailedException); }; return; } app.BeginRequest += (sender, e) => { var httpContext = ((HttpApplication)sender).Context; LogHttpRequest.TryGetCurrentHttpRequestId(out var httpRequestId); _logger.Verbose <UmbracoModule>("Begin request [{HttpRequestId}]: {RequestUrl}", httpRequestId, httpContext.Request.Url); BeginRequest(new HttpContextWrapper(httpContext)); }; //disable asp.net headers (security) // This is the correct place to modify headers according to MS: // https://our.umbraco.com/forum/umbraco-7/using-umbraco-7/65241-Heap-error-from-header-manipulation?p=0#comment220889 app.PostReleaseRequestState += (sender, args) => { var httpContext = ((HttpApplication)sender).Context; try { httpContext.Response.Headers.Remove("Server"); //this doesn't normally work since IIS sets it but we'll keep it here anyways. httpContext.Response.Headers.Remove("X-Powered-By"); httpContext.Response.Headers.Remove("X-AspNet-Version"); httpContext.Response.Headers.Remove("X-AspNetMvc-Version"); } catch (PlatformNotSupportedException) { // can't remove headers this way on IIS6 or cassini. } }; app.PostAuthenticateRequest += (sender, e) => { var httpContext = ((HttpApplication)sender).Context; //ensure the thread culture is set httpContext.User?.Identity?.EnsureCulture(); }; app.PostResolveRequestCache += (sender, e) => { var httpContext = ((HttpApplication)sender).Context; ProcessRequest(new HttpContextWrapper(httpContext)); }; app.EndRequest += (sender, args) => { var httpContext = ((HttpApplication)sender).Context; if (Current.UmbracoContext != null && Current.UmbracoContext.IsFrontEndUmbracoRequest) { LogHttpRequest.TryGetCurrentHttpRequestId(out var httpRequestId); _logger.Verbose <UmbracoModule>("End Request [{HttpRequestId}]: {RequestUrl} ({RequestDuration}ms)", httpRequestId, httpContext.Request.Url, DateTime.Now.Subtract(Current.UmbracoContext.ObjectCreated).TotalMilliseconds); } UmbracoModule.OnEndRequest(this, new UmbracoRequestEventArgs(Current.UmbracoContext, new HttpContextWrapper(httpContext))); DisposeHttpContextItems(httpContext); }; }