即使在用户通过javascript导航离开后,ASP.NET是否仍能继续可靠地处理请求?

即使在用户通过javascript导航离开后,ASP.NET是否仍能继续可靠地处理请求?,javascript,asp.net,multithreading,asynchronous,httphandler,Javascript,Asp.net,Multithreading,Asynchronous,Httphandler,环境: Windows Server 2003-IIS 6.x ASP.NET 3.5(C#) 即7,8,9 FF(无论最新的10个版本是什么) 用户场景: 用户根据大数据集输入搜索条件。启动请求后,他们将被导航到结果页面,在那里他们等待数据加载,然后可以优化数据 技术场景: 用户发送搜索条件(通过ajax调用)后,UI调用后端服务。后端服务查询事务系统,并将生成的数据放入数据库“缓存”——一个非规范化的表,用于进一步优化数据的存储(即排序、筛选)。UI等待数据被缓存,然后在收到流程完成的通

环境:

  • Windows Server 2003-IIS 6.x
  • ASP.NET 3.5(C#)
  • 即7,8,9
  • FF(无论最新的10个版本是什么)
用户场景:

用户根据大数据集输入搜索条件。启动请求后,他们将被导航到结果页面,在那里他们等待数据加载,然后可以优化数据

技术场景:

用户发送搜索条件(通过ajax调用)后,UI调用后端服务。后端服务查询事务系统,并将生成的数据放入数据库“缓存”——一个非规范化的表,用于进一步优化数据的存储(即排序、筛选)。UI等待数据被缓存,然后在收到流程完成的通知后,导航到结果页面。然后,生成的页面调用以从非规范化的表中获取数据

问题:


对于最终不得不根据输入的条件查询多个系统的大型查询,搜索速度相对较慢(15-25秒)。其他查询的速度相对较快(完全不在ASP.NET线程上执行异步操作如何?让ASP.NET代码调用服务将数据搜索排队,然后使用服务中的令牌返回浏览器,然后重定向到等待完成结果的结果页?结果页将使用服务中的令牌进行轮询


这样,您就不必担心ASP.NET是否会以某种方式了解到浏览器已移动到其他页面。

另一种选择是使用线程(
System.Threading
)。
当用户发送搜索条件时,服务器开始处理页面请求,创建负责执行搜索的新线程,并完成返回浏览器并重定向到结果页面的响应,同时该线程继续在服务器后台执行。
结果页面将继续在服务器上验证查询执行是否已完成,因为启动的线程将共享进度信息。当它完成时,结果页面将在下一个ajax调用完成时返回结果

也可以考虑使用WebSocket。在某种意义上,Web服务器本身可以告诉浏览器何时完成查询执行,因为它提供全双工通信通道。

存在属性Response.IsClientConnected,该属性用于了解长时间运行的进程是否仍在连接。此属性的原因是,即使客户端断开连接,进程仍将继续运行,并且必须通过属性手动检测,如果过早断开连接,则必须手动关闭。这不是由defaul决定的t在客户端断开连接时中断正在运行的进程

对该财产的引用:

更新


仅供参考,现在使用套接字依赖的属性非常糟糕。我强烈建议您采用一种方法,允许您快速完成一个请求,该请求记录在某个数据库或某个长时间运行任务的队列中,可能使用RabbitMQ或类似的工具,反过来使用socket.io或类似工具更新网页或应用程序一旦完成。

好的,让我看看我是否得到了它。当用户发送一些搜索条件时,你将异步启动查询执行,并立即将用户重定向到结果页面。然后,在结果页面上,你将加载页面,并继续验证服务器上的查询是否已结束,以向用户显示结果。你是如果用户退出结果页,异步查询执行是否会继续运行?是否正确?这几乎是正确的。问题不是如果用户离开结果页,它是否会继续运行,而是当用户被转移到结果页时,它是否会继续运行。在我在本地计算机上的测试中,异步查询运行ration似乎在继续运行。但是,我想验证该进程的可靠性。这是ASP.NET的设计行为还是“它在我的机器上工作”?如果您使用线程命名空间(是吗?)在Web服务器上异步运行某些处理,我想这不会是“它在我的机器上工作”它在IIS上也应该像预期的那样工作。您可以选择使用线程而不是HttpHandler吗?我们可以使用线程(也可以使用异步处理程序),但无论我们使用页面还是处理程序,都必须捕获最初的ajax调用。我们甚至可以忘记异步处理程序而使用常规的通用处理程序。另一位消息来源告诉我这种类型的解决方案。本质上,我们必须有某种类型的后台服务(很可能在ASP.NET之外)这将是监视添加的令牌,执行搜索,然后更新完成搜索的令牌?除了一个小警告之外,这听起来很棒。我们不想减慢“快速”搜索(如果可能的话)。但是,如果我们想在不进行大规模架构更改的情况下提高性能的一致性,这可能是我们必须走的道路。我仍然对ASP.NET行为的内部结构感到好奇。服务不必“监视”。它将是一个WCF服务,等待包含搜索条件的请求。它将保留条件,返回代表请求的令牌,然后开始处理搜索。它将跟踪搜索的进度。当稍后请求进度时,它将报告进度。完成后,它将返回r搜索结果。此外,如果您可以提前确定“快速”搜索将是快速的,那么您可以“在线”进行搜索。事实上,您可以让ASP.NET页面等待一秒钟左右,然后询问服务是否已启动