ASP.NET大量并发下载

时间:2011-06-25 23:44:14

标签: asp.net iis download

我目前在线有一个网络应用程序,有大约500个用户。我没想到的是网络应用程序在如此负载下表现糟糕。访问任何页面都会导致等待几分钟。基本上每个用户一旦使用Web应用程序主要功能就调用一个进程,我从另一个Web服务器读取几个字节,然后将该数据转发给用户浏览器。页面正常运行,直到它达到大约200-300个并发下载进程的某个负载,如前所述。

我正在使用IIS 7.5和ASP.NET(4)。对于数据库访问,我使用LINQ TO SQL。我已经调整了IIS并删除了任何限制,例如每个CPU的最大并发数等。我希望在这种情况下IIS配置有问题。我担心的是我的代码会为IIS生成这样的结果,或者即使这样的方法也是导致此问题的主要原因。

目前它的工作方式如下:

  • 用户访问EG.aspx

  • EG.aspx使用.NET HTTP Post和GET请求授权给其他Web服务器。

  • EG.aspx打开一个流以从第二个Web服务器读取(文件下载)

  • EG.aspx从第二个Web服务器读取1024个字节,并将这1024个字节写入浏览器

所有标题等都已正确设置。我没有在此过程中调用任何新线程。执行所有这些步骤只是一个很长的方法。文件下载量非常大(大约100MB)。在将这样的文件传输给用户的所有时间内,页面正在运行上述过程。每个用户可以多次调用此进程(下载多个文件)。

流的数量是一个问题吗?有没有什么方法可以实现相同的结果(您的Web服务器下载文件并将其发送到客户端而无需在磁盘上缓存它们)另一种方法?那种方法会是什么?

3 个答案:

答案 0 :(得分:1)

为什么不直接重定向到正在下载的文件。目前,文件正从服务器移动到您的服务器,然后移动到客户端。所以你有延迟进入那里。

您使用的是负载均衡吗?同时传输的数百个100MB文件为单个服务器提供了大量带宽。

答案 1 :(得分:1)

Web服务器 - 尤其是像IIS或Apache这样的胖Web服务器 - 实际上可以非常快速地最大化并发用户。由于功能,ASP.NET加剧了这一点。您需要做的是将此过程卸载到客户端以某种方式向您的服务器发出的Web请求之外。最简单的方法是使用某种消息总线,如MassTransit或NServiceBus。然后你可以让它像:

  1. 用户请求EG.ASPX
  2. EG.ASPX在服务总线中创建一条消息,并返回某种“处理请求”页面。
  3. 消息总线处理消息并下载文件或收到错误或其他任何内容。
  4. 用户会以某种方式通知结果 - 有很多方法可以做到这一点 - 他们的文件准备就绪
  5. 用户访问相应页面以获取其文件。
  6. 对于通知,您可以通过以下几种方式处理:

    • 如果这是一个相当短的交易,你可能会有一个“请等待”页面进行ajax pingback。
    • 如果它运行时间较长,您可能希望在用户准备就绪时向其发送电子邮件。
    • 如果您有用户门户页面,则可以在那里进行操作。

    但是,直接在你的ASP.NET页面中直接处理这个问题非常愚蠢。

答案 2 :(得分:0)

你不能在一段时间内缓存字节吗?

将它们存储在静态字典中,使用锁定,您将看到巨大的性能提升。