有没有办法通过 MVC 应用程序中的特定控制器操作为 Blazor 应用程序提供服务?

Is there a way to serve a Blazor app from a specific controller action in a MVC app?

我想在现有的 ASP.NET Core 3.0 MVC 项目中设置一个控制器操作来为 Blazor 应用程序提供服务。我在过去看到过与其他 SPA 框架类似的东西,操作的视图仅包含包含捆绑包的脚本标记,通常还有一些其他设置,例如将 SPA 构建放置在 MVC 项目的 wwwroot 上。

查看 Blazor 应用程序,它在某种程度上似乎相似,其中 index.html 文件包含 wasm 脚本。但老实说,我不确定从哪里开始设置它。有什么想法吗?

您似乎在使用 Blazor 客户端。基本上,Blazor 客户端应用程序的 条目 加载 blazor.webassembly.js<script>。此脚本将动态下载所有静态资产(*.wasm*.dlls)。请注意,如果您可以提供这些资产,则即使没有 ASP.NET Core,您也可以托管 Blazor 客户端应用程序。

由于您使用 ASP.NET 核心 MVC 作为服务器,一个简单的方法是:

  1. 添加对 Microsoft.AspNetCore.Blazor.Server 的包引用,以便我们可以仅使用一个代码来提供 *.wasm *.dll 文件。
    <PackageReference Include="Microsoft.AspNetCore.Blazor.Server" Version="3.0.0-preview9.19465.2" />
    
  2. 添加对您的客户端项目的项目引用,以便我们可以从源代码生成静态信息。假设您的客户端 Web 程序集应用程序是 MyClientSideBlazorApp:

    <ProjectReference Include="..\MyClientSideBlazorApp\MyClientSideBlazorApp.csproj" />
    
  3. 现在您可以在 Startup.cs 中注册一个中间件来为静态文件提供服务:

    app.UseClientSideBlazorFiles<MyClientSideBlazorApp.Startup>();
    app.UseStaticFiles();
    
  4. 最后,在您想要为 blazor 提供服务的任何 page/view 中,例如 Home/Privacy.cshtml 视图文件,添加一个 <script> 以加载条目还有一个 <base> 元素来确保相对路径是正确的。

    @{
       Layout = null;
    }
    <base href="/">
    
    ... 
    
    <app>Loading...</app>
    
    <script src="/_framework/blazor.webassembly.js"></script>
    

现在应该可以正常工作了。