Start making standalone hosting work again by automatically locating the client app assembly

This commit is contained in:
Steve Sanderson 2017-12-11 19:45:02 +00:00
parent 9117263114
commit 9ec79ae9f7
5 changed files with 41 additions and 8 deletions

View File

@ -25,7 +25,7 @@ namespace HostedInAspNet.Server
app.UseBlazorDevelopmentServer("../HostedInAspNet.Client");
}
app.UseBlazor<Client.Program>();
app.UseBlazor(clientAssembly: typeof(Client.Program).Assembly);
}
}
}

View File

@ -15,7 +15,7 @@ namespace MonoSanity
{
app.UseDeveloperExceptionPage();
app.UseFileServer();
app.UseBlazor<MonoSanityClient.Examples>();
app.UseBlazor(clientAssembly: typeof(MonoSanityClient.Examples).Assembly);
}
}
}

View File

@ -6,7 +6,7 @@ using System.Text;
namespace MonoSanityClient
{
public class Examples
public static class Examples
{
public static string AddNumbers(int a, int b)
=> (a + b).ToString();

View File

@ -1,8 +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 System;
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using System.IO;
namespace Microsoft.Blazor.DevHost.Server
{
@ -17,7 +21,35 @@ namespace Microsoft.Blazor.DevHost.Server
{
app.UseDeveloperExceptionPage();
app.UseBlazorDevelopmentServer(".");
app.UseBlazor<object>(); // TODO
app.UseBlazor(clientAssembly: FindClientAssembly(app));
}
private static Assembly FindClientAssembly(IApplicationBuilder app)
{
var env = app.ApplicationServices.GetRequiredService<IHostingEnvironment>();
var contentRoot = env.ContentRootPath;
var binDir = FindClientBinDir(contentRoot);
var appName = Path.GetFileName(contentRoot); // TODO: Allow for the possibility that the assembly name has been overridden
var assemblyPath = Path.Combine(binDir, $"{appName}.dll");
if (!File.Exists(assemblyPath))
{
throw new FileNotFoundException($"Could not locate application assembly at expected location {assemblyPath}");
}
return Assembly.LoadFile(assemblyPath);
}
private static string FindClientBinDir(string clientAppSourceRoot)
{
var binDebugDir = Path.Combine(clientAppSourceRoot, "bin", "Debug");
var subdirectories = Directory.GetDirectories(binDebugDir);
if (subdirectories.Length != 1)
{
throw new InvalidOperationException($"Could not locate bin directory for Blazor app. " +
$"Expected to find exactly 1 subdirectory in '{binDebugDir}', but found {subdirectories.Length}.");
}
return Path.Combine(binDebugDir, subdirectories[0]);
}
}
}

View File

@ -5,19 +5,20 @@ using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Blazor.Server.ClientFilesystem;
using System.Collections.Generic;
using System.Net.Mime;
using System.Reflection;
namespace Microsoft.AspNetCore.Builder
{
public static class BlazorAppBuilderExtensions
{
public static void UseBlazor<TProgram>(this IApplicationBuilder applicationBuilder)
public static void UseBlazor(
this IApplicationBuilder applicationBuilder,
Assembly clientAssembly)
{
var clientAppAssembly = typeof(TProgram).Assembly;
applicationBuilder.UseStaticFiles(new StaticFileOptions
{
RequestPath = "/_framework",
FileProvider = ClientFileProvider.Instantiate(clientAppAssembly),
FileProvider = ClientFileProvider.Instantiate(clientAssembly),
ContentTypeProvider = CreateContentTypeProvider(),
});
}