|
1 | 1 | // Copyright (c) .NET Foundation. All rights reserved. |
2 | 2 | // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. |
3 | 3 |
|
| 4 | +using Microsoft.AspNetCore.Hosting; |
4 | 5 | using Microsoft.AspNetCore.Http; |
5 | 6 | using Microsoft.AspNetCore.Http.Extensions; |
6 | 7 | using Microsoft.AspNetCore.NodeServices; |
@@ -36,8 +37,15 @@ public static void UsePrerendering( |
36 | 37 | // a request comes in (because we need to wait for all middleware to be configured) |
37 | 38 | var lazyBuildOnDemandTask = new Lazy<Task>(() => buildOnDemand?.Build(spaBuilder)); |
38 | 39 |
|
| 40 | + // Get all the necessary context info that will be used for each prerendering call |
39 | 41 | var appBuilder = spaBuilder.AppBuilder; |
40 | | - var prerenderer = GetPrerenderer(appBuilder.ApplicationServices); |
| 42 | + var serviceProvider = appBuilder.ApplicationServices; |
| 43 | + var nodeServices = GetNodeServices(serviceProvider); |
| 44 | + var applicationStoppingToken = GetRequiredService<IApplicationLifetime>(serviceProvider) |
| 45 | + .ApplicationStopping; |
| 46 | + var applicationBasePath = GetRequiredService<IHostingEnvironment>(serviceProvider) |
| 47 | + .ContentRootPath; |
| 48 | + var moduleExport = new JavaScriptModuleExport(entryPoint); |
41 | 49 |
|
42 | 50 | // Add the actual middleware that intercepts requests for the SPA default file |
43 | 51 | // and invokes the prerendering code |
@@ -71,13 +79,25 @@ public static void UsePrerendering( |
71 | 79 | // TODO: Add an optional "supplyCustomData" callback param so people using |
72 | 80 | // UsePrerendering() can, for example, pass through cookies into the .ts code |
73 | 81 |
|
74 | | - var renderResult = await prerenderer.RenderToString( |
75 | | - entryPoint, |
76 | | - customDataParameter: customData); |
| 82 | + var renderResult = await Prerenderer.RenderToString( |
| 83 | + applicationBasePath, |
| 84 | + nodeServices, |
| 85 | + applicationStoppingToken, |
| 86 | + moduleExport, |
| 87 | + context, |
| 88 | + customDataParameter: customData, |
| 89 | + timeoutMilliseconds: 0); |
| 90 | + |
77 | 91 | await ApplyRenderResult(context, renderResult); |
78 | 92 | }); |
79 | 93 | } |
80 | 94 |
|
| 95 | + private static T GetRequiredService<T>(IServiceProvider serviceProvider) where T: class |
| 96 | + { |
| 97 | + return (T)serviceProvider.GetService(typeof(T)) |
| 98 | + ?? throw new Exception($"Could not resolve service of type {typeof(T).FullName} in service provider."); |
| 99 | + } |
| 100 | + |
81 | 101 | private static async Task ApplyRenderResult(HttpContext context, RenderToStringResult renderResult) |
82 | 102 | { |
83 | 103 | if (!string.IsNullOrEmpty(renderResult.RedirectUrl)) |
@@ -106,15 +126,6 @@ private static string GetDefaultFileAbsoluteUrl(ISpaBuilder spaBuilder, HttpCont |
106 | 126 | return defaultFileAbsoluteUrl; |
107 | 127 | } |
108 | 128 |
|
109 | | - private static ISpaPrerenderer GetPrerenderer(IServiceProvider serviceProvider) |
110 | | - { |
111 | | - // Use the registered instance, or create a new private instance if none is registered |
112 | | - var instance = (ISpaPrerenderer)serviceProvider.GetService(typeof(ISpaPrerenderer)); |
113 | | - return instance ?? new DefaultSpaPrerenderer( |
114 | | - GetNodeServices(serviceProvider), |
115 | | - serviceProvider); |
116 | | - } |
117 | | - |
118 | 129 | private static INodeServices GetNodeServices(IServiceProvider serviceProvider) |
119 | 130 | { |
120 | 131 | // Use the registered instance, or create a new private instance if none is registered |
|
0 commit comments