Azure Web Apps Timeout long process request

问题描述:

因此,我有一个在Azure上运行的Web应用程序,并且有一个API端点将处理一个漫长的过程(大概我可以说)。在visual studio上运行local时很好,但当它变成天蓝色时,在请求开始55秒后失败。Azure Web Apps Timeout long process request

我有研究发现这个问题在每个平台上,我改变了在终点上添加这行代码的机会。

System.Web.HttpContext.Current.Server.ScriptTimeout = 10000; 

所以,现在它能够延长到超时,但仍然无法在3分50秒后处理。在这一点上,我发现还有其他的东西叫负载平衡器。他们都表示,Azure负载平衡器将在4分钟后自动终止所有请求。所以我坚持在这个地方。

所以我尝试了所有这些解决方案。

1.System.Web.HttpContext.Current.Server.ScriptTimeout = 10000; 2.System.Net.ServicePointManager.SetTcpKeepAlive(true,30000,30000); 3.使用“启动新线程”来处理长进程并将http状态代码返回给客户端,初始化进程已启动。 4.做长时间的过程作为另一个异步功能

我想要实现的很简单,一个长的过程函数可以被调度程序任务或手动触发(AJAX调用)。

有什么建议吗?

+0

我认为你需要打破你对API的客户端会发生什么,然后在服务器端会发生什么情况的说明(或者你想要发生)我很好奇看到更多关于方法的细节3.你立即返回的地方 - 为什么会失败? –

+0

@ G.Stoynev客户端将是一个AJAX调用,第一个设计是将请求发送到服务器,然后服务器在这个长的过程完成后返回,而服务器端则是启动过程的整个流程(检查,添加数据到数据库,但记录是巨大的)。对于方法3来说,这只是我的愚蠢想法,所以让我们说客户不希望得到结果,而是说过程完成与否,它从服务器获得响应并向用户显示“过程开始”。所以线程会喜欢在后台运行,它不需要响应任何结果给用户。 有何建议? –

+0

如果客户端启动Ajax调用并且服务器返回http接受状态(如果请求已开始处理但未完成),那么该如何处理?在客户端,onsuccess处理程序可以重新查询服务器,直到它接收到指示完成的http确定状态。当然客户必须知道正确的方式来唯一地识别操作。 –

这就是我在这个过程中安顿下来的方式。

如果这是一个长远的过程,它应是处理基于Web的工作,我必须通过使用Visual Studio Azure的WebJob SDK 2015年

而且重写整个过程分为webjob,为了加快整个过程(只是为了节省Azure信用费用),我直接使用DatabaseContext并使用匿名类型在ToList()上创建每个所需的表runnig。 Finanlly,我得到需要插入的项目列表,并使用BulkInsert。

一切都在3分钟内完成Azure运行时间为70k条目。

//更新我仍在使用WebJob一些后台进程最新执行

,但我加快利用EntityFramework BulkInsert,与Parallel.ForEach()沿着我的逻辑过程我的过程。 此外,在处理批量更新时,我还使用Parallel.ForEach()与using(var context=new DatabaseContext()){...}。 (有bulk.update库在那里提供良好的解决方案太)

此外,我做尝试Azure.Functions,似乎是替代Auzre.WebJob。通过使用相同的队列触发器,它的速度比WebJob更快。

对于所有后台进程,Azure都为您提供少量解决方案,只需分享任何需要此功能的人即可。

  • WebJob
  • 功能
  • 逻辑应用

我认为你达到了Azure Web Apps的默认超时时间(如果我没记错的话,我认为它是3分钟,但可能是错误的)。你能设置SCM_COMMAND_IDLE_TIMEOUT从门户 - 网络应用程序设置=>应用程序设置=>添加设置所需的值(说360(以秒为单位))。 Reference。 有一些功能可以在外部操作超时的情况下终止(信息位于上面的链接中)。

+1

这与http请求超时有什么关系?它表示这个值是关于“默认值”,当你的构建过程启动一些命令时,它可以运行长达60秒而不产生任何输出,如果时间不够长,你可以延长它,例如使它成为10分钟“ –

虽然我没有回答你的大部分问题,但我选择表达一个意见,你的“3”选项,立即向AJAX客户端返回成功状态是您解决问题的第一步。

实现TCP/IP/HTTP流量的网络基础设施在看起来空闲时间超过您的典型Web请求时间的连接上皱眉。这些行为通常不在应用程序之外(层) - 在较低的基础架构层。你可能有或没有访问这些,如果你这样做,你可以“修复”你的问题。

使用选项3.从您的问题中,结合轮询或某种形式的推送通知是您更好的解决方案IMO。