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

如何延长Azure App Service中ASP.NET Core 2.0 API的超时时间

看起来你碰到的这个超时问题,在Azure App Service上部署ASP.NET Core应用时挺常见的——毕竟超时设置是多层面的,光改一个地方可能压不住。我来帮你一步步排查:

1. 先确认你的applicationHost.xdt是否真的生效了

你提到上传了xdt但web.config里没看到connectionTimeout,大概率是xdt的格式或者目标节点不对。ASP.NET Core在IIS中是通过aspNetCore节点托管的,所以你的xdt必须针对这个节点,而不是传统的httpRuntime。正确的xdt内容应该是这样的:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer>
    <!-- 这里要确保是修改aspNetCore节点的connectionTimeout -->
    <aspNetCore xdt:Transform="SetAttributes(connectionTimeout)" connectionTimeout="00:05:00" />
  </system.webServer>
</configuration>

另外,放置位置要准确:必须放在**site文件夹根目录**(通过Kudu的话就是D:\home\site\applicationHost.xdt),不是wwwroot下面。上传后重启部署槽,然后去Kudu的Debug console里查看site\wwwroot\web.config,检查aspNetCore节点里有没有connectionTimeout="00:05:00"这个属性——如果还是没有,你可以去Kudu的Log Files\Transform目录下看转换日志,里面会明确告诉你哪里出错了。

2. 别漏了Azure App Service层面的请求超时

就算IIS的connectionTimeout改了,Azure App Service本身还有一个全局的请求超时限制,默认是230秒(约3分50秒)。如果你的请求超过这个时间,平台会直接截断连接,返回502。要改这个的话:

  • 打开Azure门户,找到你的测试部署槽
  • 进入「配置」→「常规设置」
  • 找到「请求超时」,改成你需要的时间(比如5分钟),保存后重启槽

3. 检查ASP.NET Core自身的服务器超时(Kestrel)

ASP.NET Core 2.0用的是Kestrel作为内置服务器,它自己也有超时设置,默认的KeepAlive超时和请求头超时可能不够长。你需要在Startup.cs里配置:

public void ConfigureServices(IServiceCollection services)
{
    // 其他服务配置...
    services.Configure<KestrelServerOptions>(options =>
    {
        options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(5);
        options.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(5);
    });
}

部署这个修改后的代码到测试槽,再测试长请求。

4. 排查内部调用的HttpClient超时

如果你的API在处理请求时调用了其他外部服务或API,用了HttpClient,那要注意:HttpClient默认的超时是100秒(1分40秒),如果内部调用超时,也会抛出TaskCanceledException,最终导致502。解决方法是在注册HttpClient时设置更长的超时:

// 在Startup.cs的ConfigureServices里
services.AddHttpClient("YourExternalServiceClient")
    .ConfigureHttpClient(client =>
    {
        client.Timeout = TimeSpan.FromMinutes(5);
    });

如果你是直接new的HttpClient(不推荐这种写法),也要手动设置Timeout属性。

5. 看日志找根源

你已经看到了TaskCanceledException,可以再仔细看一下日志的栈跟踪,确认这个取消是来自哪里:

  • 如果是来自Microsoft.AspNetCore.Server.IIS.Core相关的类,那就是IIS或Azure层面的超时
  • 如果是来自System.Net.Http相关的类,那就是HttpClient的内部调用超时
  • 如果是来自你自己的代码,那可能是你在代码里手动取消了任务

按这个步骤一步步排查,应该能找到问题所在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:39:02