You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET控制台应用部署Heroku遇R10启动超时崩溃求助

解决Heroku上.NET控制台应用R10启动超时错误

问题根源

Heroku对web类型进程有强制要求:必须在启动后60秒内绑定到环境变量$PORT指定的端口。你的Discord机器人属于后台控制台服务,本身不需要监听HTTP端口,因此被Heroku判定为启动超时,触发R10错误。

推荐解决方案:改用Worker进程

因为你的应用是后台服务(Discord机器人),不需要处理HTTP请求,最直接的解决方式是修改Heroku的进程类型:

  1. 修改/创建Procfile
    在项目根目录创建或编辑Procfile文件,将内容改为:

    worker: dotnet YourProject.dll
    

    把YourProject替换成你实际的项目名称(即编译后生成的DLL文件名)。

  2. 启动Worker Dyno
    推送代码到Heroku后,执行以下命令启动worker进程:

    heroku ps:scale worker=1
    

    这样Heroku会以worker进程运行你的应用,不再强制要求绑定端口,彻底避免R10错误。

备选方案:保留Web进程并绑定端口(仅当需要HTTP服务时)

如果你的应用需要同时提供HTTP端点(比如健康检查),则需要让应用绑定到Heroku提供的$PORT和0.0.0.0地址:

  1. 读取环境变量
    修改ConfigureAppConfiguration部分,添加环境变量读取支持,确保能获取到Heroku的$PORT:

    .ConfigureAppConfiguration(x =>
    {
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true)
            .AddEnvironmentVariables() // 新增:加载系统环境变量
            .Build();
        x.AddConfiguration(configuration);
    })
    
  2. 配置Kestrel绑定端口
    添加Web主机配置,让Kestrel监听0.0.0.0和$PORT:

    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseKestrel(options =>
        {
            // 优先读取Heroku的PORT环境变量,默认用5000
            var port = int.Parse(Environment.GetEnvironmentVariable("PORT") ?? "5000");
            options.ListenAnyIP(port); // 绑定到所有IP和指定端口
        });
        // 如果有Startup类,添加这行
        webBuilder.UseStartup<Startup>();
    })
    

额外提示

  • 不要把Discord Token硬编码在appsettings.json里,用Heroku环境变量配置:
    heroku config:set token=你的Discord机器人Token
    
  • 推送代码前,确保本地能正常运行应用,排除代码本身的问题。

内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:57:41