You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8升级到.NET 9后MapStaticAssets的使用方法及相关编译、运行时错误修复

.NET 8升级到.NET 9后MapStaticAssets的使用方法及相关编译、运行时错误修复

最近升级到.NET 9 MVC时碰到MapStaticAssets的问题?别慌,我来一步步帮你解决这些编译和运行时错误。

先搞懂编译错误CS1929的原因

你之前把app.UseStaticFiles()换成app.MapStaticAssets()后报错,核心原因是这俩方法的调用对象不一样:

  • UseStaticFiles是IApplicationBuilder的扩展方法,所以能直接在app(IApplicationBuilder实例)上调用;
  • 而MapStaticAssets是IEndpointRouteBuilder的扩展方法,必须拿到这个类型的实例才能调用,直接用IApplicationBuilder的app肯定会报错。

解决方案1:保留原有Startup.cs的写法

如果你还想继续用传统的Startup.cs,不用改Configure方法的参数,只需要把MapStaticAssets放到UseEndpoints的委托里调用就行,因为endpoints就是IEndpointRouteBuilder类型:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
{
    // 其他中间件配置(比如异常处理、HTTPS重定向等)
    if (!env.IsDevelopment())
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }
    app.UseHttpsRedirection();

    // 必须先启用路由中间件
    app.UseRouting();

    app.UseAuthorization();

    // 在UseEndpoints里调用MapStaticAssets
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapStaticAssets(); // 这里就是正确的调用方式
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

这样编译错误就会消失啦。

解决改Configure参数后出现的运行时错误

你之前把Configure的参数改成WebApplication app后出现InvalidOperationException: No service for type 'Microsoft.AspNetCore.Builder.WebApplication' has been registered,这是因为传统Startup模式下,DI容器里并没有注册WebApplication实例。

WebApplication是.NET 6+推荐的Top-Level Statements模式(也就是没有Startup.cs的模板)里的对象,传统Startup模式是通过CreateHostBuilder构建宿主,两者的DI注册逻辑不一样,所以不能直接把WebApplication注入到Configure方法里。

解决方案2:迁移到.NET 9默认的Top-Level Statements模式

如果想彻底适配.NET 9的写法,推荐直接迁移到无Startup.cs的模式,步骤如下:

  1. 把Startup.cs里ConfigureServices的代码移到Program.cs的builder.Services中;
  2. 用WebApplication.CreateBuilder替代原来的CreateHostBuilder;
  3. 直接在WebApplication实例上调用MapStaticAssets(因为WebApplication本身实现了IEndpointRouteBuilder接口)。

示例Program.cs代码:

var builder = WebApplication.CreateBuilder(args);

// 原来Startup.cs中ConfigureServices的内容移到这里
builder.Services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"Keys"));
builder.Services.AddControllersWithViews();

var app = builder.Build();

// 配置中间件
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();

// 直接调用MapStaticAssets,无需嵌套在UseEndpoints里
app.MapStaticAssets();
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

这样既符合.NET 9的推荐实践,也不会出现任何编译或运行时错误。

备注:内容来源于stack exchange,提问作者Andrus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:33:07