ASP.NET Core 5 Razor页面IIS返回404,Visual Studio正常,求排查思路
排查.NET Core 5 Razor页面生产环境404问题的方向
问题背景
基于.NET Core 5构建的应用,95%功能正常,但单个Razor页面/providers/information在生产IIS环境及使用dotnet MySite.dll启动时返回404,Visual Studio本地运行正常。页面结构与其他正常页面一致,仅包含基础HTML和简单的OnGet逻辑,调用的API/user/me在全站通用。
排查步骤
检查页面文件部署状态
- 确认生产服务器上该页面的
.cshtml文件存在于对应目录(如Pages/Providers/Information.cshtml),与项目结构一致 - 验证文件权限,确保IIS应用池身份拥有读取该文件的权限
- 检查项目文件(
.csproj),确认该页面未被标记为<ExcludeFromPublish>true</ExcludeFromPublish>而排除在发布包外
- 确认生产服务器上该页面的
验证路由匹配逻辑
- 检查
Startup.cs/Program.cs中的Razor页面路由配置,确认无自定义路由约束干扰/providers/information的匹配 - 临时启用路由诊断日志,记录匹配过程:
// 在ConfigureServices中添加日志配置 services.AddLogging(builder => { builder.AddConsole(); builder.AddDebug(); }); // 在Configure的UseEndpoints中添加路由调试元数据 app.UseEndpoints(endpoints => { endpoints.MapRazorPages().WithMetadata(new RouteDebugMetadata()); }); - 排查是否存在路由冲突:确认无其他Razor页面、API控制器使用相同的
/providers/information路由模板
- 检查
排查页面Model加载异常
- 确认
ProviderInformationChangeRequestModel正确继承自自定义基类(或官方PageModel),且命名空间、程序集在生产环境中正常部署 - 查看应用日志(Windows事件查看器、应用本地日志文件),检查是否存在Model初始化失败的异常(如依赖注入错误)
- 确认
验证API调用的上下文差异
- 临时注释
OnGet中的API调用逻辑,硬赋值测试页面是否正常返回:public async Task<IActionResult> OnGet() { this.EntityModel = new ProviderChangeModel(); this.EntityModel.ProviderUserId = 1; this.EntityModel.ProviderId = 1; return Page(); } - 如果注释后页面正常,说明该场景下
/user/me的请求上下文存在差异(如认证状态、请求头缺失),需进一步排查请求上下文
- 临时注释
检查发布编译问题
- 确认项目是否启用Razor预编译,查看
.csproj中的<RazorCompileOnPublish>true</RazorCompileOnPublish>设置,若启用则检查预编译程序集是否包含该页面定义 - 重新执行
dotnet publish -c Release,查看发布日志是否有该页面相关的警告或错误
- 确认项目是否启用Razor预编译,查看
排查IIS特殊配置
- 检查IIS站点的URL重写规则,确认无规则拦截
/providers/information路径 - 确认IIS应用池的.NET CLR版本设置为无托管代码(适配.NET Core应用)
- 检查IIS请求筛选规则,确认未禁止该路径的请求
- 检查IIS站点的URL重写规则,确认无规则拦截
内容的提问来源于stack exchange,提问作者Scott Salyer
相关产品推荐
相关产品推荐

