ASP.NET Core站点IIS部署报500错误,命令行运行正常
解决ASP.NET Core部署IIS后500错误无日志问题
这种部署到IIS后出现500内部错误还没日志的情况,我之前踩过不少坑,咱们一步步来排查:
1. 优先检查ASP.NET Core Hosting Bundle是否安装
你单独安装了runtime,但ASP.NET Core Hosting Bundle才是IIS托管.NET Core应用的关键组件——它包含了runtime和IIS集成模块。去服务器的「控制面板→程序和功能」里看看有没有Microsoft ASP.NET Core 2.0.7 Hosting Bundle,如果没有,下载对应版本安装(一定要匹配你的应用.NET Core版本2.0.7),安装完成后重启IIS(可以用命令 iisreset)。
2. 确认web.config的stdout日志配置
既然连stdout文件都没有,先把这个基础日志打通:
- 确保web.config里的
stdoutLogEnabled设为true,且stdoutLogFile路径正确,比如:<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" /> - 注意:这里的路径是相对于应用根目录的,要保证
logs文件夹存在,并且应用池的标识账户有读写权限。如果你的应用池用的是ApplicationPoolIdentity,那权限要给IIS AppPool\你的应用池名称,而不是只给IIS_IUSRS(后者是网站用户组,和应用池账户不是一回事)。
3. 排查Serilog的部署配置问题
调试时正常不代表生产环境配置没问题:
- 检查
appsettings.Production.json里的Serilog配置,日志路径尽量用绝对路径,比如C:\inetpub\wwwroot\YourApp\logs\log-.txt——因为IIS托管时的工作目录和命令行运行时不一样,相对路径可能找不到文件夹。 - 确认应用启动时Serilog的初始化时机:要在WebHost构建之前就配置Serilog,比如Program.cs里的代码应该类似:
public static void Main(string[] args) { // 先配置Serilog Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(Configuration) .CreateLogger(); try { var host = BuildWebHost(args); host.Run(); } catch (Exception ex) { Log.Fatal(ex, "应用启动失败"); } finally { Log.CloseAndFlush(); } } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseSerilog() // 绑定Serilog到WebHost .UseStartup<Startup>() .Build(); - 额外加个启动异常捕获:如果应用在启动阶段就崩溃,Serilog可能还没初始化,所以可以在Main方法里用try-catch把异常写到绝对路径的文件里,比如:
catch (Exception ex) { File.WriteAllText(@"C:\temp\startup-crash.txt", ex.ToString()); Log.Fatal(ex, "应用启动失败"); }
4. 检查IIS应用池的.NET CLR版本
这个是超级容易忽略的点:ASP.NET Core应用的应用池必须设置为无托管代码。打开IIS管理器,找到你的应用池→右键「高级设置」,把「.NET CLR版本」改成「无托管代码」,保存后重启应用池。
5. 查看Windows事件查看器找线索
如果以上都没解决,去「事件查看器→Windows日志→应用程序」里找错误事件,.NET Runtime或者IIS相关的日志会告诉你具体哪里出问题了——比如缺少某个依赖库、配置文件格式错误、权限不足等,这些信息比500错误有用多了。
内容的提问来源于stack exchange,提问作者Steen Tøttrup




