所以,我有一个在Azure上运行的Web应用程序,并且有一个API端点可以处理一个很长的过程(大约我可以说的时间)。在visual studio上运行本地时很好,但是当它进入azure时,它会在请求启动55秒后失败。
我已经在每个平台上研究了这个问题,我改变了在终点上添加这行代码的机会。
System.Web.HttpContext.Current.Server.ScriptTimeout = 10000;
所以现在它可以延长到超时,但仍然无法在3分50秒后处理。在这一点上,我发现还有其他东西叫负载均衡器。他们都说Azure Load Balancer会在4分钟后自动终止所有请求。所以我坚持住这个地方。
所以我尝试了所有这些解决方案。
1.System.Web.HttpContext.Current.Server.ScriptTimeout = 10000; 2.System.Net.ServicePointManager.SetTcpKeepAlive(true,30000,30000); 3.使用“开始新线程”处理长进程并将http状态代码返回到客户端初始化进程启动。 4.将长进程作为另一个异步函数
我想要实现的非常简单,一个可以由调度程序任务或手动(AJAX调用)触发的长过程函数。
有什么建议吗?
答案 0 :(得分:1)
我认为您点击Azure Web Apps的默认超时(我认为这是3分钟,如果我没记错的话,但可能是错误的)。你可以从门户网站设置SCM_COMMAND_IDLE_TIMEOUT - 网络应用设置=> app settings =>添加具有所需值的设置(例如360(以秒为单位))。 Reference。 有些功能可以在外部操作超时时终止它们(信息在上面的链接上)。
答案 1 :(得分:1)
这就是我在这个过程中安顿下来的方式。
如果这是一个长期运行的过程,它应该处理web作业,我已经在visual studio 2015上使用Azure WebJob SDK将整个过程重写为webjob。
另外,为了加快整个过程(仅为了节省成本),我直接使用 DatabaseContext 并使用匿名类型在ToList()上运行每个必需的表。 Finanlly,我得到一个需要插入的项目列表,并使用BulkInsert。
一切都在3分钟内完成,Azure运行时间为70k条目。
//更新最新实施
我仍在使用WebJob进行后台处理,但我使用EntityFramework BulkInsert
和Parallel.ForEach()
来加速我的流程,以实现我的逻辑过程。
此外,我还在处理批量更新时使用带有using(var context=new DatabaseContext()){...}
的Parallel.ForEach()。 (还有bulk.update库也提供了很好的解决方案)
此外,我尝试 Azure.Functions ,它似乎取代了 Auzre.WebJob 。通过使用相同的队列触发器,它比WebJob更快。
对于所有后台流程,Azure为您提供的解决方案很少,只需分享任何人都需要此功能。
答案 2 :(得分:0)
虽然我没有回答你的大多数问题,但我选择表达你的“3”的意见。选项,立即将成功状态返回给AJAX客户端是解决问题的第一步。
实现TCP / IP / HTTP流量的网络基础架构对连接似乎空闲的时间长于典型的Web请求。这些行为通常不在您的应用程序(层)之外 - 在较低的基础架构层。您可能会或可能不会访问这些内容,如果您这样做,您可以“修复”您的问题。
使用选项3.来自您的问题,结合投票或某种形式的推送通知是您更好的解决方案IMO。