使用ASP.NET下载服务器如何完成长时间运行的同步请求?

时间:2010-10-23 23:26:03

标签: asp.net iis-7 download binary

我的ASP.NET应用程序是一个下载应用程序(无页面),它从本地网络读取巨大的二进制文件(1-2 GB - >超过1小时的下载时间并提供恢复支持)并将它们流式传输到Web客户端(每个请求) - >一个大的二进制响应,所以根本没有文本/ html响应。我使用HTTP Handler(.ashx)而不是(.aspx)页面来处理请求。使用共享缓冲区和生产者 - 消费者模式主线程(来自ASP.NET线程池)创建另一个线程,他们一起完成工作。最后两个线程都退出(返回池)。

所以我有一个长时间运行的请求,使用线程池中的线程,一般不推荐但我的应用程序中没有任何页面,它是否仍然是使用ASP.NET线程池中的线程的瓶颈?

环境:server 2008 64位,IIS 7.0和.NET 4.0

对于这种情况应该考虑哪些因素? 任何评论都表示赞赏。

2 个答案:

答案 0 :(得分:0)

如果您使用ASP.NET池中的线程来提供这些文件,那么无论可用带宽如何,您都将很快达到并发下载的硬限制。线程正在做什么并不重要;如果他们都忙/被阻止,其他请求将无法完成。

经过这么长的时间,如果不仔细配置,你也可能遇到其他麻烦;下载可能最终被取消,应用程序可能会不必要地重置。

通过ASHX处理程序提供这些文件的原因是什么?

答案 1 :(得分:0)

正如我解释here,只需在ASHX中使用IHttpAsyncHandler实现来启动自定义线程并在asp.net线程内完成处理(从而将其返回到池中)。使用此方法,您可以每秒启动数千个下载,而不会耗尽asp.net线程池线程。 (如何以及如果您希望提供这么多请求是另一个讨论主题)

编辑:只是不要忘记在你的主题结束时调用asyncRequestState.CompleteRequest(),否则asp.net将不知道你已经完成了请求。