protected void ContextBeginRequest(object sender, EventArgs e) { HttpContext httpContext = _context.Context; //read current var requestParams = new RequestParams { RequestUri = httpContext.Request.Url, UserAgent = httpContext.Request.UserAgent }; if (Utility.IsRequestShouldBePrerendered(requestParams, _config)) { var rendererConfig = new PrerenderServiceConfiguration(_config); var renderer = new SnapshotRenderer(rendererConfig); string snapshotUrl = Utility.GetSnapshotUrl(httpContext.Request.Url); //render page html PrerenderResult response; try { response = renderer.RenderPage(snapshotUrl).Result; } catch (AggregateException ex) { string messages = ""; for (int i = 0; i < ex.InnerExceptions.Count; i++) { messages += ex.InnerExceptions[i].Message + Environment.NewLine; } httpContext.Response.Write( string.Format( "Failed to prerender request '{0}'. One or more exeptions has occured: '{1}'. Stack trace: '{2}'", snapshotUrl, messages, ex.StackTrace)); httpContext.Response.StatusCode = 500; httpContext.Response.Flush(); _context.CompleteRequest(); return; } httpContext.Response.Write(response.Content); httpContext.Response.ContentType = "text/html"; httpContext.Response.StatusCode = (int)response.StatusCode; httpContext.Response.Flush(); _context.CompleteRequest(); } }
public override async Task Invoke(IOwinContext context) { PrerenderConfig config = PrerenderConfig.GetCurrent(); var requestParams = new RequestParams { RequestUri = context.Request.Uri, UserAgent = context.Request.Headers["user-agent"] }; if (Utility.IsRequestShouldBePrerendered(requestParams, config)) { var rendererConfig = new PrerenderServiceConfiguration(config); var renderer = new SnapshotRenderer(rendererConfig); string snapshotUrl = Utility.GetSnapshotUrl(context.Request.Uri); //render page html PrerenderResult response; try { response = await renderer.RenderPage(snapshotUrl); } catch (WebException e) { context.Response.Write( string.Format("Failed to prerender request '{0}'. Error message: '{1}'. Stack trace: '{2}'", snapshotUrl, e.Message, e.StackTrace)); context.Response.StatusCode = 500; return; } await context.Response.WriteAsync(response.Content); context.Response.ContentType = "text/html"; context.Response.StatusCode = (int)response.StatusCode; context.Set("HTML_SNAPSHOT_MIDDLEWARE", true); } else { await Next.Invoke(context); } }