C# Azure Web应用程序超时长进程请求

C# Azure Web应用程序超时长进程请求,c#,ajax,asp.net-mvc,azure,web-applications,C#,Ajax,Asp.net Mvc,Azure,Web Applications,所以,我有一个在Azure上运行的web应用程序,还有一个API端点,它将处理一个很长的过程(我可以说大约一个小时)。在VisualStudio上运行本地时是可以的,但当它转到azure时,在请求启动55秒后失败 我在每一个平台上都有关于这个问题的研究,我改变了一个机会,在这行代码的末尾添加 System.Web.HttpContext.Current.Server.ScriptTimeout = 10000; 所以现在它可以扩展到超时,但3分50秒后仍然无法处理。在这一点上,我发现还有另一个

所以,我有一个在Azure上运行的web应用程序,还有一个API端点,它将处理一个很长的过程(我可以说大约一个小时)。在VisualStudio上运行本地时是可以的,但当它转到azure时,在请求启动55秒后失败

我在每一个平台上都有关于这个问题的研究,我改变了一个机会,在这行代码的末尾添加

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调用)


有什么建议吗?

我想你达到了Azure Web应用程序的默认超时时间(如果我没记错的话,我想是3分钟,但可能是错的)。您能否从门户设置SCM_命令\u空闲\u超时-web应用程序设置=>应用程序设置=>添加具有所需值的设置(例如360(秒))。
有一种功能会在外部操作超时时终止它们(信息在上面的链接中)。

虽然我没有回答您的大多数问题,但我选择表达一种观点,即您的“3.”选项,即立即将成功状态返回到AJAX客户机是您解决问题的第一步

实现TCP/IP/HTTP通信的网络基础设施不支持比典型web请求空闲时间长的连接。这些行为通常在应用程序(层)之外——在较低的基础架构层。您可能有权也可能没有权访问这些,如果您有权,您可以“修复”您的问题


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

因此,这就是我在这个过程中的解决方法

如果这是一个长期运行的过程,它将在web作业上处理,我已经在visual studio 2015上使用Azure webjob SDK将整个过程重写为webjob

此外,为了加快整个过程(只是为了节省azure credit的成本),我直接使用了DatabaseContext,并使每个必需的表都以匿名类型在ToList()上运行。最后,我得到一个需要插入的项目列表,并使用BulkInsert

所有操作都在3分钟内完成,Azure运行时有70k个条目

//最新实施的更新

我仍在使用WebJob进行一些后台处理,但我通过使用
EntityFramework BulkInsert
,以及用于逻辑处理的
Parallel.ForEach()
,加快了处理速度。 此外,在处理批量更新时,我还使用Parallel.ForEach()和
一起使用(var context=new DatabaseContext()){…}
。(还有bulk.update库也提供了很好的解决方案)

此外,我确实尝试了Azure.Functions,它们似乎取代了Auzre.WebJob。通过使用相同的队列触发器,它比WebJob更快

对于所有的后台进程,Azure为您提供的解决方案很少,请分享,以防有人需要

  • 网络作业
  • 功能
  • 逻辑应用程序

我认为您需要详细说明API客户端发生了什么,然后是服务器端发生了什么(或者您希望发生什么)。我很想了解有关方法3的更多细节。您立即返回的位置-为什么会失败?@G.Stoynev客户端将是一个AJAX调用,第一个设计是将请求发送到服务器,然后在这个漫长的过程完成后返回服务器,而服务器端则启动整个流程(检查,将数据添加到数据库,但记录非常庞大)。因为方法3只是我愚蠢的想法,所以让我们说,无论进程是否完成,客户端都不想得到结果,它从服务器得到响应,并向用户显示“进程已启动”。所以线程就像在后台运行一样,它不需要向用户响应任何结果。有什么建议吗?如果请求已开始处理但尚未完成,客户端是否启动Ajax调用,服务器是否返回http accepted status。在客户端,onsuccess处理程序可以重新查询服务器,直到它接收到http OK状态(指示已完成)。当然,客户必须知道唯一标识操作的方法。您的“第三种”方法最适合典型的web应用程序。网络实现为HTTP流量服务的方式(即底层网络基础设施设备),一旦您的连接开始长时间处于空闲状态,您很可能会遇到严重且无法解决的问题。我将以书面形式详细说明answer@FrankQ.that这是我对方法3的选择。可能非常类似于你在onedrive上上传文件,它会向你显示状态和进程栏。所以我开始这个过程,可能需要另一个api端点来返回这个过程的状态。您以前可能看到过任何引用吗?这与http请求超时有什么关系?该值表示“默认情况下,当您的构建过程启动某些命令时,它最多可以运行60秒而不产生任何输出。如果时间不够长,您可以将其延长,例如,延长10分钟”