使用Visual Studio容器工具调试blazor wasm

时间:2019-12-07 17:01:25

标签: visual-studio docker blazor-client-side

一段时间以来,我在某些项目中一直使用blazor wasm(由aspnet核心托管)。从dotnet core开始,我希望在容器中运行我的应用程序。 Visual Studio具有容器和业务流程支持,我已经将其添加到了blazor解决方案中,并且在发布配置中运行良好。

但是,当我尝试使用调试配置(也称为container fast mode)时,出现以下错误:

System.ArgumentException: The path must be absolute. (Parameter 'root')
   at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters)
   at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root)
   at Microsoft.AspNetCore.Builder.BlazorHostingApplicationBuilderExtensions.UseClientSideBlazorFiles(IApplicationBuilder app, String clientAssemblyFilePath)
   at Microsoft.AspNetCore.Builder.BlazorHostingApplicationBuilderExtensions.UseClientSideBlazorFiles[TClientApp](IApplicationBuilder app)
   at BlazorWasmOnDocker.Server.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env) in D:\OpenSource\aspnetcore-apis\BlazorWasmOnDocker\BlazorWasmOnDocker\Server\Startup.cs:line 36
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder app)

我已经看到为此创建了多个github问题。 https://github.com/aspnet/AspNetCore/issues/9704#issuecomment-544272050,但由于blazor wasm尚未脱离Beta版,因此这些问题尚未解决。

如何在快速模式下将asp托管的blazor wasm作为容器运行?

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我使用最新的Visual Studio模板(blazor 3.1预览版4)和最新的Visual Studio 2019预览版创建了一个托管在ASP.net核心中的blazor wasm应用程序。

搭建解决方案后,我在Visual Studio中添加了docker支持和业务流程支持。这给了我一个可以在发布模式下运行的设置。

要修复调试模式/容器快速模式,我将阅读Visual Studio如何在调试和发布模式下运行容器的信息。请参阅https://aka.ms/containerfastmode,以了解Visual Studio如何使用生成的Dockerfile来构建映像以进行更快的调试。

简而言之:使用发布模式时,Visual Studio会构建您的dockerfile,从而创建您的应用,并在容器本身中生成并发布,这将创建一个包含您的ASP服务器和blazor客户端的应用。 /app

使用调试模式时,Visual Studio将仅运行dockerfile的第一阶段,然后将“服务器”项目安装到容器中。然后,它将在您的计算机上构建“服务器”项目(这比在容器中构建它的速度更快),因为服务器项目已装入,编译结果也位于容器中。然后,Visual Studio在启动应用程序的容器中启动远程调试会话。

调试设置与发行设置的不同之处在于调试时没有发布,因此,blazor客户端不会复制到您的asp服务器应用中,而是与生成的blazor配置文件链接(位于我的bin目录中)被命名为BlazorWasmOnDocker.Client.blazor.config)。

由于构建在容器外部进行,因此生成的blazor.config也创建了仅在容器外部工作的链接。对于我的设置,它类似于:

D:\Software\repos\aspnetcore-apis\BlazorWasmOnDocker\BlazorWasmOnDocker\Client\BlazorWasmOnDocker.Client.csproj

这里就是问题所在,或者实际上是两个问题:

  1. 客户端项目未安装在容器中
  2. blazor项目的配置位置不适用于 在容器中运行

解决第一个问题可以通过创建调试docker-compose.yml文件(将其命名为docker-compose.vs.debug.yml,以便Visual Studio在调试时使用它)来完成,这会在客户端项目中添加挂载:

version: '3.4'

services:
  blazorwasmondocker.server:
    volumes:
      - ./BlazorWasmOnDocker/Client:/Client

解决第二个问题可以通过在调试构建后在生成的blazor配置中更正客户端项目的路径来完成。我是在program.cs中这样做的,您也可以在容器启动时或在构建挂钩后进行。


        public static void Main(string[] args)
        {
#if DEBUG
            const string blazorConfigPath = @"/app/bin/Debug/netcoreapp3.1/BlazorWasmOnDocker.Client.blazor.config";
            var blazorConfig = File.ReadAllText(blazorConfigPath);
            blazorConfig = Regex.Replace(blazorConfig, @"[a-zA-Z]:\\.+?\\Client\\", "/Client/")
                .Replace('\\', '/');
            File.WriteAllText(blazorConfigPath, blazorConfig);
#endif

            BuildWebHost(args).Run();
        }

作为参考,我已将一个演示项目推送到github,并将此修补程序放入1次提交:https://github.com/Rora/aspnetcore-apis/commit/7ef4682d1466bd94faaba9adafac2cb0f6f59723