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

Azure Web App上WebApi应用频繁重启致异步任务中断,求排查原因

问题

我在Azure Web App服务上运行一个WebApi应用,其中一个API端点会启动一个耗时1-2分钟的处理流程,该流程用Task.Run()异步执行,端点会立即返回无需等待流程完成。

问题在于,有时该流程会在完成前意外终止。我添加了大量日志,显示流程运行正常直至日志突然中断,try/catch块也未记录任何错误。同时我在Application_Start()方法中添加了日志,发现当流程日志中断时,Application_Start()的日志也会出现,这表明应用发生了重启,但我在Azure日志中未找到任何重启相关的记录。重启发生的时机无规律,可能在流程的不同阶段出现,也可能不发生;重启间隔也不固定,可能是几秒或几分钟。

示例API控制器(实际应用中StuffProcessor是独立的公共类,为简化展示此处设为私有类):

using System.Threading.Tasks;
using System.Web.Http;

namespace testApp.Controllers
{
    public class TestController : ApiController
    {
        private class StuffProcessor
        {
            public void Run()
            {
                // 执行耗时1-2分钟的操作
                // 包括从Azure Blob存储下载文件并处理
            }
        }

        [HttpPost]
        [Route("api/DoSomeStuff")]
        public string DoSomeStuff()
        {
            var stuffProcessor = new StuffProcessor();
            Task.Run(() => stuffProcessor.Run());

            return "Started";
        }
    }
}
可能的原因及解决方案
  • 应用池自动回收:Azure Web App的应用池默认有回收策略,比如闲置超时(默认20分钟无请求就回收)、内存占用阈值、定期回收等。一旦应用池回收,整个应用进程会重启,后台运行的Task会直接终止。
    解决办法:在Azure门户的App Service配置中,调整应用池设置,关闭闲置超时;如果是内存触发的回收,优化任务的内存占用,或者升级App Service计划获取更多内存;更可靠的方式是改用Azure WebJobs或Azure Functions来处理这类后台耗时任务,它们专门设计用于长时间运行的异步任务,不受Web App应用池回收的影响。

  • 资源超限被平台强制重启:如果你的应用在执行任务时,CPU或内存占用超过了当前App Service计划的配额,Azure平台可能会强制重启应用进程,这类重启可能不会在常规日志中留下明确记录。
    解决办法:在Azure门户的App Service监控面板查看CPU、内存的实时使用情况,确认是否存在超限;如果是资源不足,升级到更高规格的App Service计划;同时优化任务逻辑,比如分批处理文件、减少内存占用。

  • 文件系统变更触发重启:Azure Web App会监控wwwroot目录的文件变更,一旦检测到文件新增、修改或删除(比如日志文件写入到wwwroot下、自动部署残留文件等),就会触发应用重启。
    解决办法:将日志文件写入到Web App的临时目录(环境变量%TEMP%指向的路径)或者Azure Blob存储,避免写入wwwroot;检查是否有自动部署、FTP上传等操作导致wwwroot目录变更,关闭不必要的自动同步。

  • 未捕获的异常导致进程崩溃:虽然你在StuffProcessor.Run()里加了try/catch,但Task.Run()启动的线程如果出现未捕获的异常(比如异步操作中的异常、非托管代码抛出的异常),会导致整个应用进程崩溃重启,这类异常可能不会被你的局部try/catch捕获。
    解决办法:在Task.Run()的委托内部包裹全局try/catch,确保所有异常都被捕获并记录;同时在应用的全局层面注册AppDomain.CurrentDomain.UnhandledException事件,捕获未处理的全局异常,排查具体崩溃原因。

  • Azure底层架构维护:Azure偶尔会对应用所在的主机进行维护操作,比如补丁更新、硬件故障切换,这可能会导致应用实例重启,这类重启的日志可能不会出现在应用自己的日志中。
    解决办法:启用App Service的多实例部署,当某个实例重启时,其他实例可以继续处理任务;或者使用持久化任务队列(比如Azure Queue Storage),将任务请求存入队列,由后台服务(WebJobs/Functions)从队列取任务执行,即使实例重启,任务也不会丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:57:48