From 0b5294a8f5e8aa73b9cd8815d75c84a1efeddc6b Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Tue, 20 Feb 2018 12:17:52 +0000 Subject: [PATCH] Enable SPA fallback routing on server --- .../BlazorAppBuilderExtensions.cs | 35 ++++++++++++------- .../Microsoft.AspNetCore.Blazor.Server.csproj | 1 + 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNetCore.Blazor.Server/BlazorAppBuilderExtensions.cs b/src/Microsoft.AspNetCore.Blazor.Server/BlazorAppBuilderExtensions.cs index 366ebca7cc..dfd269190c 100644 --- a/src/Microsoft.AspNetCore.Blazor.Server/BlazorAppBuilderExtensions.cs +++ b/src/Microsoft.AspNetCore.Blazor.Server/BlazorAppBuilderExtensions.cs @@ -1,13 +1,12 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNetCore.StaticFiles; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Blazor.Server; +using Microsoft.AspNetCore.StaticFiles; using Microsoft.Extensions.FileProviders; -using System.Collections.Generic; using System.IO; using System.Net.Mime; -using System; namespace Microsoft.AspNetCore.Builder { @@ -43,19 +42,16 @@ namespace Microsoft.AspNetCore.Builder var config = BlazorConfig.Read(options.ClientAssemblyPath); var clientAppBinDir = Path.GetDirectoryName(config.SourceOutputAssemblyPath); var clientAppDistDir = Path.Combine(clientAppBinDir, "dist"); - var distFileProvider = new PhysicalFileProvider(clientAppDistDir); - - applicationBuilder.UseDefaultFiles(new DefaultFilesOptions + var distDirStaticFiles = new StaticFileOptions { - FileProvider = distFileProvider - }); - - applicationBuilder.UseStaticFiles(new StaticFileOptions - { - FileProvider = distFileProvider, + FileProvider = new PhysicalFileProvider(clientAppDistDir), ContentTypeProvider = CreateContentTypeProvider(), - }); + }; + // First, match the request against files in the client app dist directory + applicationBuilder.UseStaticFiles(distDirStaticFiles); + + // Next, match the request against static files in wwwroot if (!string.IsNullOrEmpty(config.WebRootPath)) { // In development, we serve the wwwroot files directly from source @@ -67,8 +63,21 @@ namespace Microsoft.AspNetCore.Builder FileProvider = new PhysicalFileProvider(config.WebRootPath) }); } + + // Finally, use SPA fallback routing (serve default page for anything else, + // excluding /_framework/*) + applicationBuilder.MapWhen(IsNotFrameworkDir, childAppBuilder => + { + childAppBuilder.UseSpa(spa => + { + spa.Options.DefaultPageStaticFileOptions = distDirStaticFiles; + }); + }); } + private static bool IsNotFrameworkDir(HttpContext context) + => !context.Request.Path.StartsWithSegments("/_framework"); + private static IContentTypeProvider CreateContentTypeProvider() { var result = new FileExtensionContentTypeProvider(); diff --git a/src/Microsoft.AspNetCore.Blazor.Server/Microsoft.AspNetCore.Blazor.Server.csproj b/src/Microsoft.AspNetCore.Blazor.Server/Microsoft.AspNetCore.Blazor.Server.csproj index 83548505e6..55f27f3495 100644 --- a/src/Microsoft.AspNetCore.Blazor.Server/Microsoft.AspNetCore.Blazor.Server.csproj +++ b/src/Microsoft.AspNetCore.Blazor.Server/Microsoft.AspNetCore.Blazor.Server.csproj @@ -6,6 +6,7 @@ +