.NET Core 6升级后视图渲染抛出View NotFound异常求助
.NET 6 视图渲染到Stream时ViewNotFound异常解决方案
根因
.NET 6 调整了Razor视图引擎的默认行为:
- 默认启用视图预编译,未开启运行时编译时,视图引擎只会从程序集嵌入资源中查找预编译生成的视图,不会扫描本地Content类型的cshtml文件
- 直接空初始化的
DefaultHttpContext缺少应用根路径、请求基础路径等必要上下文,视图引擎无法正确拼接Views/Shared下的文件查找路径 - 旧版本.NET Core默认会将输出目录下的Content视图纳入查找范围,该逻辑在.NET 6中默认关闭
修复方案
启用Razor运行时编译
首先通过Nuget安装Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation包,在服务注册阶段添加运行时编译支持:// Program.cs 服务配置段 builder.Services.AddControllersWithViews() .AddRazorRuntimeCompilation();非Web宿主场景(比如控制台/类库中渲染视图),需要手动补全Razor相关服务注册,同时配置视图引擎的文件查找根路径:
services.AddMvcCore() .AddRazorRuntimeCompilation(options => { // 配置视图文件所在的根目录,即存放Views文件夹的路径 options.FileProviders.Add(new PhysicalFileProvider(AppContext.BaseDirectory)); });修正视图查找的上下文初始化逻辑
不要直接空实例化DefaultHttpContext,补充必要的路径配置,修正后的代码片段如下:var env = _serviceProvider.GetRequiredService<IWebHostEnvironment>(); var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider, Request = { PathBase = "/" } }; var actionContext = new ActionContext( httpContext, new RouteData(), new ActionDescriptor() ); // 查找Shared目录下的视图时,直接传视图名称即可,不需要加路径前缀 var viewEngineResult = _viewEngine.FindView(actionContext, viewName, isMainPage: false); // 调试阶段可加校验输出查找路径,快速定位路径配置问题 if (!viewEngineResult.Success) { var errMsg = $"视图{viewName}未找到,已尝试查找路径:\n{string.Join("\n", viewEngineResult.SearchedLocations)}"; throw new InvalidOperationException(errMsg); }校验项目文件配置
确认.csproj中配置了视图文件的输出规则,确保编译后视图文件会被拷贝到输出目录对应路径:<ItemGroup> <Content Include="Views\**\*.cshtml" CopyToOutputDirectory="PreserveNewest" /> </ItemGroup>
若不需要运行时修改视图文件,更推荐使用默认预编译模式:将视图的生成操作从Content改回默认的Razor编译项,让SDK自动生成包含预编译视图的view.dll,此时无需开启运行时编译即可正常查找视图,性能也更高。
内容的提问来源于stack exchange,提问作者Atefeh
相关产品推荐
相关产品推荐

