Asp.net Core 2.0项目发布至IIS后仅显示空白页问题求助
我之前也碰到过类似的情况——数据库能正常初始化但页面一片空白,连错误提示都没有,大概率是IIS配置、应用启动环节或者路由出了问题,咱们一步步来排查:
先确认ASP.NET Core运行环境是否齐全
服务器上必须安装对应版本的ASP.NET Core Runtime(2.0.x系列)和AspNetCoreModule模块。你可以去控制面板→程序→程序和功能里核对有没有这两个组件,缺的话赶紧补上,安装完重启IIS再试。扒日志找线索(关键!)
页面没错误不代表没异常,日志里肯定藏着原因:- 应用日志:看你部署的站点目录里有没有
logs文件夹,如果没有,先把web.config里的stdoutLogEnabled改成true,重启站点后会生成日志文件,里面能看到应用启动时的详细报错,比如依赖注入失败、路由配置错误之类的。 - IIS日志:在IIS管理器里找到你的站点,右键选「日志」,打开日志目录看最新条目,有没有500、404这类状态码,或者请求根本没到达应用的记录。
- 应用日志:看你部署的站点目录里有没有
补全并校验web.config配置
你贴的web.config内容不全,正常的Core 2.0配置应该包含完整的aspNetCore节点,参考示例:<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="dotnet" arguments=".\你的应用程序名.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" /> </system.webServer> </configuration>重点检查:
processPath和arguments是不是正确指向你的dll文件,文件名和路径不能错;stdoutLogEnabled一定要设为true方便排查。直接在命令行启动应用验证
打开服务器的命令提示符,进入站点部署目录,运行dotnet 你的应用程序名.dll,看看能不能正常启动,控制台有没有报错。如果命令行能正常启动但IIS不行,那就是IIS的权限或配置问题。检查站点权限
IIS应用池的身份有没有访问站点目录的权限?比如用ApplicationPoolIdentity的话,要给站点目录添加IIS AppPool\你的应用池名称的读写权限,尤其是logs文件夹和本地数据库文件(如果用的是SQLite这类本地库)。核对路由配置
数据库能初始化说明应用启动了一部分,但路由可能没配置对。去Startup.cs的Configure方法里看看,有没有加默认路由:app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });如果默认的Home/Index控制器或动作不存在,就会返回空白页面。
临时开启详细错误页面
排查期间可以在Startup.cs里临时打开开发环境错误页面,哪怕是生产环境也能看到详细报错:if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { // 临时替换成下面的代码,排查完记得改回去 app.UseDeveloperExceptionPage(); // app.UseExceptionHandler("/Home/Error"); // app.UseHsts(); }重新发布部署后,页面应该会显示具体的错误信息了。
内容的提问来源于stack exchange,提问作者topcool




