diff --git a/src/Components/Web.JS/src/Services/WebRootComponentManager.ts b/src/Components/Web.JS/src/Services/WebRootComponentManager.ts
index 097a38c3e057..1c1dbb067db0 100644
--- a/src/Components/Web.JS/src/Services/WebRootComponentManager.ts
+++ b/src/Components/Web.JS/src/Services/WebRootComponentManager.ts
@@ -470,10 +470,6 @@ function isDescriptorInDocument(descriptor: ComponentDescriptor): boolean {
}
function areWebAssemblyResourcesLikelyCached(config: MonoConfig): boolean {
- if (!config.cacheBootResources) {
- return false;
- }
-
const hash = getWebAssemblyResourceHash(config);
if (!hash) {
return false;
diff --git a/src/Components/WebAssembly/Directory.Build.props b/src/Components/WebAssembly/Directory.Build.props
index 836334255bca..b64f9033fc9a 100644
--- a/src/Components/WebAssembly/Directory.Build.props
+++ b/src/Components/WebAssembly/Directory.Build.props
@@ -7,4 +7,7 @@
false
+
+ false
+
diff --git a/src/Components/WebAssembly/testassets/HostedInAspNet.Server/BootResourceRequestLog.cs b/src/Components/WebAssembly/testassets/HostedInAspNet.Server/BootResourceRequestLog.cs
index dcd1f2c94325..0dfd3e43bead 100644
--- a/src/Components/WebAssembly/testassets/HostedInAspNet.Server/BootResourceRequestLog.cs
+++ b/src/Components/WebAssembly/testassets/HostedInAspNet.Server/BootResourceRequestLog.cs
@@ -9,11 +9,14 @@ public class BootResourceRequestLog
{
private readonly ConcurrentBag _requestPaths = new ConcurrentBag();
- public IReadOnlyCollection RequestPaths => _requestPaths;
+ public IReadOnlyCollection RequestPathsWithNewContent => _requestPaths;
- public void AddRequest(HttpRequest request)
+ public void AddRequest(string originalRequestPath, HttpResponse response)
{
- _requestPaths.Add(request.Path);
+ if (response.StatusCode != StatusCodes.Status304NotModified)
+ {
+ _requestPaths.Add(originalRequestPath);
+ }
}
public void Clear()
diff --git a/src/Components/WebAssembly/testassets/HostedInAspNet.Server/Startup.cs b/src/Components/WebAssembly/testassets/HostedInAspNet.Server/Startup.cs
index 7225c954e2b8..bf75aad5012d 100644
--- a/src/Components/WebAssembly/testassets/HostedInAspNet.Server/Startup.cs
+++ b/src/Components/WebAssembly/testassets/HostedInAspNet.Server/Startup.cs
@@ -24,17 +24,18 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env, BootReso
{
var mapAlternativePathApp = Configuration.GetValue("UseAlternativeBasePath");
var mapAllApps = Configuration.GetValue("MapAllApps");
- app.Use((context, next) =>
+ app.Use(async (context, next) =>
{
+ string originalRequestPath = context.Request.Path;
+ await next(context);
+
// This is used by E2E tests to verify that the correct resources were fetched,
// and that it was possible to override the loading mechanism
if (context.Request.Query.ContainsKey("customizedbootresource")
- || context.Request.Headers.ContainsKey("customizedbootresource")
- || context.Request.Path.Value.EndsWith("/blazor.boot.json", StringComparison.Ordinal))
+ || context.Request.Headers.ContainsKey("customizedbootresource"))
{
- bootResourceRequestLog.AddRequest(context.Request);
+ bootResourceRequestLog.AddRequest(originalRequestPath, context.Response);
}
- return next(context);
});
if (env.IsDevelopment())
diff --git a/src/Components/test/E2ETest/Tests/BootResourceCachingTest.cs b/src/Components/test/E2ETest/Tests/BootResourceCachingTest.cs
index b15e36dff42f..d40c7612866e 100644
--- a/src/Components/test/E2ETest/Tests/BootResourceCachingTest.cs
+++ b/src/Components/test/E2ETest/Tests/BootResourceCachingTest.cs
@@ -19,9 +19,6 @@ namespace Microsoft.AspNetCore.Components.E2ETest.Tests;
public partial class BootResourceCachingTest
: ServerTestBase
{
- // The cache name is derived from the application's base href value (in this case, '/')
- private const string CacheName = "dotnet-resources-/";
-
public BootResourceCachingTest(
BrowserFixture browserFixture,
AspNetSiteServerFixture serverFixture,
@@ -56,114 +53,13 @@ public void CachesResourcesAfterFirstLoad()
Navigate("/");
WaitUntilLoaded();
var subsequentResourcesRequested = GetAndClearRequestedPaths();
- Assert.DoesNotContain(subsequentResourcesRequested, path =>
- path.Contains("/dotnet.native.", StringComparison.Ordinal) &&
- path.EndsWith(".wasm", StringComparison.Ordinal));
- Assert.NotEmpty(subsequentResourcesRequested.Where(path => path.EndsWith(".js", StringComparison.Ordinal)));
- Assert.DoesNotContain(subsequentResourcesRequested, path =>
- !path.Contains("/dotnet.native.", StringComparison.Ordinal) &&
- path.EndsWith(".wasm", StringComparison.Ordinal));
- }
-
- [Fact]
- public async Task IncrementallyUpdatesCache()
- {
- // Perform a first load to populate the cache
- Navigate("/");
- WaitUntilLoaded();
- var cacheEntryUrls1 = GetCacheEntryUrls();
- var cacheEntryForComponentsDll = cacheEntryUrls1.Single(IsFingerprintedComponentsEntry);
- var cacheEntryForDotNetWasm = cacheEntryUrls1.Single(IsFingerprintedDotNetWasmEntry);
- var cacheEntryForDotNetWasmWithChangedHash = cacheEntryForDotNetWasm.Replace(".sha256-", ".sha256-different");
-
- // Remove some items we do need, and add an item we don't need
- RemoveCacheEntry(cacheEntryForComponentsDll);
- RemoveCacheEntry(cacheEntryForDotNetWasm);
- AddCacheEntry(cacheEntryForDotNetWasmWithChangedHash, "ignored content");
- var cacheEntryUrls2 = GetCacheEntryUrls();
- Assert.DoesNotContain(cacheEntryForComponentsDll, cacheEntryUrls2);
- Assert.DoesNotContain(cacheEntryForDotNetWasm, cacheEntryUrls2);
- Assert.Contains(cacheEntryForDotNetWasmWithChangedHash, cacheEntryUrls2);
-
- // On the next load, we'll fetch only the items we need (not things already cached)
- GetAndClearRequestedPaths();
- Navigate("about:blank");
- Browser.Equal(string.Empty, () => Browser.Title);
- Navigate("/");
- WaitUntilLoaded();
- var subsequentResourcesRequested = GetAndClearRequestedPaths();
- Assert.Collection(subsequentResourcesRequested.Where(url => url.Contains(".wasm")),
- requestedDll => Assert.True(IsFingerprintedComponentsEntry(requestedDll)),
- requestedDll => Assert.True(IsFingerprintedDotNetWasmEntry(requestedDll)));
-
- var cacheEntryUrls3 = GetCacheEntryUrls();
- // wait until the cache was cleaned, max 500ms
- for (var i = 0; i < 5; i++)
- {
- if (!cacheEntryUrls3.Contains(cacheEntryForDotNetWasmWithChangedHash))
- {
- break;
- }
- await Task.Delay(100); // wait for cache purge
- cacheEntryUrls3 = GetCacheEntryUrls();
- }
- Assert.Contains(cacheEntryForComponentsDll, cacheEntryUrls3);
- Assert.Contains(cacheEntryForDotNetWasm, cacheEntryUrls3);
- Assert.DoesNotContain(cacheEntryForDotNetWasmWithChangedHash, cacheEntryUrls3);
- }
-
- [GeneratedRegex("/Microsoft\\.AspNetCore\\.Components\\.\\w*\\.wasm")]
- private static partial Regex GetFingerprintedComponentsEntryRegex { get; }
-
- [GeneratedRegex("/dotnet\\.native\\.\\w*\\.wasm")]
- private static partial Regex GetFingerprintedDotNetWasmEntryRegex { get; }
-
- private static bool IsFingerprintedComponentsEntry(string url)
- => GetFingerprintedComponentsEntryRegex.IsMatch(url);
-
- private static bool IsFingerprintedDotNetWasmEntry(string url)
- => GetFingerprintedDotNetWasmEntryRegex.IsMatch(url);
-
- private IReadOnlyCollection GetCacheEntryUrls()
- {
- var js = @"
- (async function(cacheName, completedCallback) {
- const cache = await caches.open(cacheName);
- const keys = await cache.keys();
- const urls = keys.map(r => r.url);
- completedCallback(urls);
- }).apply(null, arguments)";
- var jsExecutor = (IJavaScriptExecutor)Browser;
- var result = (IEnumerable