Net Core 3.1 ISpaStaticFileProvider 发布时出现问题

Net Core 3.1 ISpaStaticFileProvider Issue while Publishing

我无法制作我的 Net Core 3.1 网站 运行。读取标准输出文件说:

未处理的异常。 System.InvalidOperationException:要使用UseSpaStaticFiles,您必须首先在服务提供者中注册一个ISpaStaticFileProvider,通常通过调用services.AddSpaStaticFiles.

我发布这个项目从来没有遇到过问题,Startup.cs 有一段时间没有修改了。

也许我忘记在从 2.2 到 3.1 的迁移中做一些更改?

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization();
    services.AddControllersWithViews();
    services.AddMvcCore().AddRazorPages().AddRazorRuntimeCompilation();
    services.AddJsReport(new LocalReporting().UseBinary(JsReportBinary.GetBinary()).KillRunningJsReportProcesses().AsUtility().Create());
    services.ConfigureAuthentication(Configuration.GetValue<string>("Secret"));

    services.AddAutoMapper(profileTypes);

    services.ConfigureCors();

    services.AddDbContext<TavoraContext>
        (options => options.UseMySql(Configuration.GetConnectionString("DefaultConnection"),
            mysqlOptions =>
            {
                mysqlOptions.ServerVersion(new Version(8, 0, 16), ServerType.MySql);
                mysqlOptions.MigrationsAssembly("TavoraCore");
            }));

    // Autofac
    var containerBuilder = new ContainerBuilder();
    containerBuilder.RegisterModule<TavoraService.AutofacModule>();
    containerBuilder.Populate(services);
    var container = containerBuilder.Build();

    // In production, the Angular files will be served from this directory
    services.AddSpaStaticFiles(configuration =>
    {
        configuration.RootPath = "ClientApp/dist";
    });

    return new AutofacServiceProvider(container);
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();

        //if (Regex.IsMatch(Configuration["ASPNETCORE_URLS"], @"https?://localhost[:/]")) // is local
        //{
        //    string tsDefinitionsPath = "./ClientApp/src/app/models/";
        //    string tsDefinitionsFullPath = Path.Combine(env.ContentRootPath, tsDefinitionsPath);

        //    app.GenerateTypeScriptInterfaces(tsDefinitionsFullPath);

        //    app.UseCors(policy => policy.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());
        //}
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    
    app.UseStaticFiles();
    app.UseSpaStaticFiles();
    
    app.UseStaticFiles(new StaticFileOptions()
    {
        FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"Resources")),
        RequestPath = new PathString("/Resources")
    });

    app.UseStaticFiles(new StaticFileOptions()
    {
        FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"Themes")),
        RequestPath = new PathString("/Themes")
    });

    app.UseRouting();
    app.UseCors();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller}/{action=index}/{id?}");
    });

    app.UseSpa(spa =>
    {
        // To learn more about options for serving an Angular SPA from ASP.NET Core,
        // see https://go.microsoft.com/fwlink/?linkid=864501

        spa.Options.SourcePath = "ClientApp";

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

好吧,我希望这个回答有时能对某人有所帮助。

带有 Net Core 3.0+ 的 Autofac 需要一些更改。

public IServiceProvider ConfigureServices -> public void ConfigureServices

而且,显然,删除行:

return new AutofacServiceProvider(container);

网站正在建设中