AspNetCore React 只能在 dev 模式下找到 spa 文件

AspNetCore React can only find spa files in dev mode

我的 AspNetCore/React 项目在开发环境中工作正常,但是一旦我 运行 在任何其他环境中我得到 System.InvalidOperationException: The SPA default page middleware could not return the default page '/index.html' because it was not found, and no other middleware handled the request.

startup.cs 配置方法的结尾如下所示

      app.UseSpa(spa =>
      {
        spa.Options.SourcePath = "ClientApp";

        if (env.IsDevelopment())
        {
          spa.UseReactDevelopmentServer(npmScript: "start");
        }
      });

但由于这与 dotnet new react 生成的应用程序中的相应代码相同,我想是其他原因扰乱了它。

网络服务器确实启动了,我可以访问 Swagger 页面。只是找不到合适的应用程序。破解上面的代码,以便 spa.UseReactDevelopmentServer(npmScript: "start");运行s 导致在所有环境中找到该应用程序(已加载特定于环境的配置),但由 React 开发服务器提供服务。

我会这一行

spa.Options.SourcePath = "ClientApp";

是发现 /index.html 和朋友的原因,但有些东西阻止他们被发现。

我还应该看什么?

我看过这个 The SPA default page middleware could not return the default page 但我不认为这是我面临的问题。

对该项目的搜索显示只有一个文件 index.html,它位于 ClientApp/public。 Configure方法是这样开始的

  if (env.IsDevelopment())
  {
    app.UseDeveloperExceptionPage();
  }
  else
  {
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days...
    app.UseHsts();
  }

  app.UseHttpsRedirection();
  app.UseStaticFiles();
  app.UseSpaStaticFiles();

React 资产不是由 dotnet builddotnet run 构建的,甚至 -c Release 也不是。

同时构建您需要的 React 资产 dotnet publish

由于早期使用 dotnet publish,此要求可能会被资产的存在所掩盖。在那种情况下,它们可能会过时。因此,对于 dev 以外的任何环境,您 必须 使用 dotnet publish.

为什么 dotnet builddotnet run 不构建 React 资产?在开发中你不需要它们,因为你正在使用开发服务器进行热插拔。在生产中,您几乎肯定会使用 dotnet publish.

准备的资产

为什么我不记得了?我几乎从不 为 dev 以外的环境构建。我不为生产而构建,CICD 这样做。专业测试人员比程序员更容易意识到这一点,因为他们是为开发环境以外的环境构建的。