.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的模式,步骤如下:
- 把
Startup.cs里ConfigureServices的代码移到Program.cs的builder.Services中; - 用
WebApplication.CreateBuilder替代原来的CreateHostBuilder; - 直接在
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

