具有长时间运行同步请求的ASP.NET应用程序的注意事项

时间:2010-10-22 18:27:38

标签: asp.net configuration iis-7 long-running-processes

在Windows Server 2008 64位,IIS 7.0和.NET 4.0下,如果ASP.NET应用程序(使用ASP.NET线程池,同步请求处理)长时间运行(> 30分钟)。 Web应用程序没有页面,主要目的是以块(~5 MB)读取大文件(> 1 GB)并将它们传输到客户端。代码:

while (reading)
{
    Response.OutputStream.Write(buffer, 0, buffer.Length);
    Response.Flush();
}

单个生产者 - 为每个请求实现的单个消费者模式有两个线程。我不在这里使用任务库,但如果它在这种情况下比传统的线程创建有优势,请告诉我。使用HTTP处理程序(.ashx)而不是(.aspx)页面。在压力测试下,CPU利用率不是问题,但是对于单个工作进程,在210个并发客户端之后,新连接会遇到超时。这是通过Web园艺解决的,因为我不使用会话状态。我不确定我是否错过了任何重大问题,但请告诉我您认为应该采取哪些其他考虑因素?

例如,由于“连接超时”,IIS会关闭长时间运行的TCP连接,因为正常的ASP.NET页面在不到5分钟的时间内处理完毕,因此我应该增加该值。

我感谢你的想法。

5 个答案:

答案 0 :(得分:2)

就个人而言,我会考虑这种处理的不同机制。 HTTP请求/ Web应用程序不是为这类事物而设计的,稳定性非常困难,当您使用这种类型的模型时,您会遇到许多可能导致重大问题的风险。

我会把处理移到后端进程,这样你就可以在asp.net运行时外面了,这样你就可以更好地控制启动/关闭等等。

答案 1 :(得分:2)

首先,从不。决不。决不!在线程池线程中执行任何需要超过几秒钟的处理。它们的数量有限,它们被系统用于许多事情。这是在寻找麻烦。

其次,虽然处理程序是个好主意,但你对“动态生成”的含义有点模糊你是说你是在动态加密文件而这种加密可能需要30分钟?或者你的意思是你从数据库中提取数据并组装文件?或者下载需要30分钟下载?

编辑:

正如我所说,不要使用线程池来进行长时间运行。创建自己的线程,或者如果您使用的是.NET 4,请使用Task并将其指定为长时间运行。

答案 2 :(得分:1)

不应以这种方式实现长时间运行的进程。将其传递给您设置的服务。

如果您确实要为客户端挂起页面,请考虑从AJAX连接到不阻塞IO线程的内容 - 例如node.js。

对于许多客户端推送通知不是ASP.NET可以处理由于线程使用的问题,因此我的node.js.如果您的负载较低,您还有其他选择。

答案 3 :(得分:0)

处理长时间运行进程的Web 1.0方法是在服务器上生成它们并立即返回。生成的关闭服务使用进度更新数据库,站点上的页面可以查询进度。

此技术的最常见用法是获取包裹递送。在我的软件包显示之前,您无法保持HTTP连接处于打开状态,因此它只是为您提供了查询进度的方法。后台流程涉及协调获取物品,包装物品,将其运送到UPS卡车等所需的所有步骤。一直以来,每个步骤都记录在数据库中。从概念上讲,它是一样的。

基于问题编辑进行编辑:只需立即返回结果页面,并在生成的线程或进程中在服务器上生成二进制文件。使用Ajax检查文件是否准备就绪,何时提供链接。

答案 4 :(得分:0)

使用Web-Gardening可以提高应用程序的稳定性。

由于您没有aspx页面而关闭缓存

如果没有性能分析,很难提供更多建议。你内置了VS并找到了瓶颈。