Skip to content
This repository was archived by the owner on Apr 8, 2020. It is now read-only.

Commit 5bdb771

Browse files
In SpaPrerenderingExtensions, don't assume that an IHttpContextAccessor will be available. Get HttpContext from middleware params instead.
1 parent c47d5bf commit 5bdb771

File tree

2 files changed

+24
-24
lines changed

2 files changed

+24
-24
lines changed

src/Microsoft.AspNetCore.SpaServices/Prerendering/DefaultSpaPrerenderer.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,6 @@ internal class DefaultSpaPrerenderer : ISpaPrerenderer
1919
private readonly IHttpContextAccessor _httpContextAccessor;
2020
private readonly INodeServices _nodeServices;
2121

22-
public DefaultSpaPrerenderer(
23-
INodeServices nodeServices,
24-
IServiceProvider serviceProvider)
25-
: this(
26-
nodeServices,
27-
(IApplicationLifetime)serviceProvider.GetService(typeof(IApplicationLifetime)),
28-
(IHostingEnvironment)serviceProvider.GetService(typeof(IHostingEnvironment)),
29-
(IHttpContextAccessor)serviceProvider.GetService(typeof(IHttpContextAccessor)))
30-
{
31-
}
32-
3322
public DefaultSpaPrerenderer(
3423
INodeServices nodeServices,
3524
IApplicationLifetime applicationLifetime,

src/Microsoft.AspNetCore.SpaServices/Prerendering/SpaPrerenderingExtensions.cs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

4+
using Microsoft.AspNetCore.Hosting;
45
using Microsoft.AspNetCore.Http;
56
using Microsoft.AspNetCore.Http.Extensions;
67
using Microsoft.AspNetCore.NodeServices;
@@ -36,8 +37,15 @@ public static void UsePrerendering(
3637
// a request comes in (because we need to wait for all middleware to be configured)
3738
var lazyBuildOnDemandTask = new Lazy<Task>(() => buildOnDemand?.Build(spaBuilder));
3839

40+
// Get all the necessary context info that will be used for each prerendering call
3941
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);
4149

4250
// Add the actual middleware that intercepts requests for the SPA default file
4351
// and invokes the prerendering code
@@ -71,13 +79,25 @@ public static void UsePrerendering(
7179
// TODO: Add an optional "supplyCustomData" callback param so people using
7280
// UsePrerendering() can, for example, pass through cookies into the .ts code
7381

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+
7791
await ApplyRenderResult(context, renderResult);
7892
});
7993
}
8094

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+
81101
private static async Task ApplyRenderResult(HttpContext context, RenderToStringResult renderResult)
82102
{
83103
if (!string.IsNullOrEmpty(renderResult.RedirectUrl))
@@ -106,15 +126,6 @@ private static string GetDefaultFileAbsoluteUrl(ISpaBuilder spaBuilder, HttpCont
106126
return defaultFileAbsoluteUrl;
107127
}
108128

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-
118129
private static INodeServices GetNodeServices(IServiceProvider serviceProvider)
119130
{
120131
// Use the registered instance, or create a new private instance if none is registered

0 commit comments

Comments
 (0)