You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动