【问题标题】:Download server with ASP.NET how to accomplish long running synchronous requests?用 ASP.NET 下载服务器如何完成长时间运行的同步请求?
【发布时间】:2010-10-23 23:26:03
【问题描述】:

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

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

环境:服务器 2008 64 位,IIS 7.0 和 .NET 4.0

在这种情况下应该考虑什么? 任何意见表示赞赏。

【问题讨论】:

    标签: asp.net iis-7 download binary


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我在 200 个并发客户端后的压力测试超时,但它通过在默认线程中增加工作进程来解决(因为我不使用会话状态,所以我可以使用 IIS 7 的此功能)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 2016-05-23
      • 2017-06-29
      • 2013-10-19
      • 2011-10-12
      • 2011-04-29
      相关资源
      最近更新 更多