使用ASP.NET传输大型二进制文件的最佳实践是什么?

5

Consider an ASP.NET page with this code:

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

应用程序应该进行高度性能调优,处理成千上万个并发请求,其主要目的是通过高速连接向客户端传输巨型二进制文件。我可以使用ASP.NET页面HTTP处理程序IHttpAsyncHandlerISAPI过滤器等方式来完成这项工作。
问题是,哪种方法是最佳选择?

通过套接字从其他服务器接收二进制数据。 - Xaqron
该进程不受CPU限制,但因为它很长,在压力测试ASP.NET时会饱和(线程池中没有剩余线程),因此客户端在有足够的CPU和RAM的情况下超时。 - Xaqron
1个回答

2
如果页面容易受到I/O限制,那么我会选择异步方式。但是你也应该在Stream对象上使用异步读取方法(如果可用)。
更多信息请参见:

带有异步示例的FileStream构造函数

针对你收到此数据通过套接字的评论,你还会发现大多数System.Net.Sockets命名空间类支持异步行为。

据我所知,ISAPI过滤器是最快的方法,但我不知道是否可以使用C#编写它,如果可以,我是否有访问ASP.NET功能(如调用Web服务等)的权限。 - Xaqron
@xaqron - 你使用的是哪个版本的IIS? - Kev
没有限制。我现在可以使用IIS 7.0,因为这是我的选择。请检查我添加到问题中的评论。 - Xaqron
@Xaqron - 你不需要使用ISAPI过滤器来解决这个问题。你只需要更好地管理你的ASP.NET线程,使它们不会阻塞读取源套接字和写入输出流的数据。使用异步技术就可以实现这一点。 - Kev
我在 MSDN 上找到了一篇关于异步处理程序使用的文章,它针对我已经遇到的同样问题(客户端超时,而没有看到资源短缺 -> asp.net 池饱和)进行了解决。但是阅读后,我有一个新问题。你能否看一下这个问题:http://stackoverflow.com/questions/3893215/how-to-configure-asp-net-thread-count-upper-limit-based-on-system-resources - Xaqron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接