100多个并发用户试图下载文件(asp.net C#应用程序)

100多个并发用户试图下载文件(asp.net C#应用程序),c#,asp.net,download,C#,Asp.net,Download,我正在尝试在asp.net应用程序中实现文件下载功能。大约200名用户将同时使用该应用程序下载各种文件。 它将托管在IIS 7上。我不希望应用程序服务器因为同时出现多个请求而崩溃 我假设,通过在循环中调用Context.Response.Flush(),我将清除在此之前读取的所有文件数据,因此应用程序内存使用将保持一致。我可以对当前代码进行哪些其他优化,或者在这样的场景中应该使用哪些其他方法 请求将针对各种文件,文件大小可以在100KB到10MB之间 我当前的代码如下: FileStream i

我正在尝试在asp.net应用程序中实现文件下载功能。大约200名用户将同时使用该应用程序下载各种文件。 它将托管在IIS 7上。我不希望应用程序服务器因为同时出现多个请求而崩溃

我假设,通过在循环中调用Context.Response.Flush(),我将清除在此之前读取的所有文件数据,因此应用程序内存使用将保持一致。我可以对当前代码进行哪些其他优化,或者在这样的场景中应该使用哪些其他方法

请求将针对各种文件,文件大小可以在100KB到10MB之间

我当前的代码如下:

FileStream inStr = null;
byte[] buffer = new byte[1024];
String fileName = @"C:\DwnldTest\test.doc";
long byteCount; inStr = File.OpenRead(fileName);

Response.AddHeader("content-disposition", "attachment;filename=test.doc");

while ((byteCount = inStr.Read(buffer, 0, buffer.Length)) > 0)
{
    if (Context.Response.IsClientConnected)
    {
        Context.Response.ContentType = "application/msword";
        //Context.Response.BufferOutput = true;                    
        Context.Response.OutputStream.Write(buffer, 0, buffer.Length);
        Context.Response.Flush();                    
    }
}

在代码示例中,您没有关闭/处理inStr。这可能会影响性能

另一种更简单的方法是使用内置方法:


它应该已经过优化,可以为您打开/关闭文件。

也许您想使用
FileSystemWatcher
类来检查文件是否被修改,并仅在检测到此类更改时将其读入内存。在剩下的时间里,只需返回已经存储在内存中的字节数组。我不知道
HttpResponse.WriteFile
方法是否对此类文件修改更改敏感,或者是否总是从给定路径读取文件,但这似乎也是一个很好的选择,因为它是由现成的框架提供的。

您可以在发送文件时使用
Response.TransmitFile
来节省服务器内存

Response.ContentType = "application/pdf";

Response.AddHeader("content-disposition", "attachment; filename=testdoc.pdf");

Response.TransmitFile(@"e:\inet\www\docs\testdoc.pdf");

Response.End();

由于您正在向客户端发送一个现有文件,请考虑使用<代码> HythPrimthS.TimeFrasehttp://msdn.microsoft.com/en-us/library/12s31dhy.aspx)

查看.NET代码,这似乎会将文件写入转发到IIS,而不是在ASP.NET进程中读取/写入
HttpResponse.WriteFile(string,false)
HttpResponse.Write(string)
似乎做了同样的事情

为了验证文件发送是否中继到IIS,在
HttpResponse.Output
property-它应该是
HttpWriter
类型。
HttpWriter.\u buffers
数组现在应该包含一个新元素
HttpFileResponseElement


当然,您应该始终调查缓存在您的场景中是否合适,并测试是否正在使用它。

乍一看,只需设置ContentType一次,然后调用Response。在循环后结束。您的文件有多大?如果内存足够小,那么将其插入RAM可能会更有效,这样您对IO的命中率就会低得多。