【问题标题】:What's the best practice for transferring huge binary files with ASP.NET?使用 ASP.NET 传输大型二进制文件的最佳实践是什么?
【发布时间】:2011-04-22 20:53:16
【问题描述】:

考虑使用以下代码的 ASP.NET 页面:

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

应用程序应该经过高度性能调整并处理数千个并发请求,主要目的是通过高速连接将巨大的二进制文件传输到客户端。我可以使用ASP.NET pageHTTP HandlerIHttpAsyncHandlerISAPI filter 和 ...

问题是为此目的的最佳选择是什么?

【问题讨论】:

  • 通过socket从其他服务器接收二进制数据
  • 进程不受 CPU 限制,但因为它很长,在压力测试下 ASP.NET 饿死(池中没有更多线程),因此客户端在有足够的 CPU 和 RAM 时会超时。

标签: c# asp.net binary data-transfer


【解决方案1】:

如果页面可能受 I/O 限制,那么我会走异步之路。但是您也应该在 Stream 对象上使用异步读取方法(如果可用)。

欲了解更多信息,请参阅:

FileStream Constructor - with async example

为了解决您通过套接字接收此数据的评论,您还会发现大多数 System.Net.Sockets 命名空间类都支持异步行为。

【讨论】:

  • 我研究过 ISAPI 过滤器是最快的方法,但我不知道是否可以用 C# 编写一个过滤器,如果可以,我是否可以访问 asp.net 功能,例如调用 web 服务,等等……
  • @xaqron - 你使用的是什么版本的 IIS?
  • 没有限制。我现在可以使用 IIS 7.0,因为它是我的选择。请检查我添加到问题的评论。
  • @Xaqron - 你不需要 ISAPI 过滤器。您只需要更好地管理您的 ASP.NET 线程,这样它们就不会阻塞从源套接字读取数据并写入输出流。使用异步技术是如何实现这一点的。
  • 我在 MSDN 上找到了一篇关于异步处理程序使用的文章,该文章针对的是我已经遇到的相同问题(客户端超时,而没有看到资源短缺 -> asp.net 池饱和)。但是在阅读之后我有一个新问题。请你看一下:stackoverflow.com/questions/3893215/…
猜你喜欢
  • 2011-03-17
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多