我不寻找任何替代的流媒体文件内容从

我有一个处理程序,在那里我必须交付大文件给客户的请求.我面临着以下问题,

文件的平均大小为4到100 MB,所以让我们考虑80MB文件下载情况.

Buffering On, Slow Start

Response.BufferOutput = True;

这会导致文件启动非常缓慢,因为用户下载,甚至进度条直到几秒钟(通常为3到20秒)才会出现,原因是,IIS首先读取整个文件,确定内容长度,然后开始文件传输.文件在视频播放器中播放,运行速度非常慢,但iPad只会先下载部分文件,所以运行速度很快.

Buffering Off, No Content-Length, Fast Start, No Progress

Reponse.BufferOutput = False;

这会导致即时启动,但终端客户端(典型的浏览器,如Chrome)不知道内容长度,因为IIS也不知道,所以它不会显示进度,而是显示下载的X KB.

Buffering Off, Manual Content-Length, Fast Start, Progress and Protocol Violation

Response.BufferOutput = False;
Response.AddHeader("Content-Length", file.Length);

这会导致在Chrome等浏览器中立即正确下载文件,但在某些情况下,IIS处理程序会导致"远程客户端关闭连接"错误(这是非常常见的),而其他WebClient会导致协议冲突.This happens 5 to 10% of all requests, not every requests.

我猜发生的情况是,当我们不进行缓冲时,IIS不会发送任何名为100 Continue的内容,并且客户端可能会在不期望任何输出的情况下断开连接.然而,从源读取文件可能需要更长的时间,但在客户端,我增加了超时,但看起来像IIS超时,并且无法控制.

我是否可以强制回复发送100继续,不让任何人关闭连接?

UPDATE

我在Firefox/Chrome中发现了以下标题,对于违反协议或错误的标题,这里似乎没有什么不寻常的.

Access-Control-Allow-Headers:*
Access-Control-Allow-Methods:POST, GET, OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Max-Age:1728000
Cache-Control:private
Content-Disposition:attachment; filename="24.jpg"
Content-Length:22355
Content-Type:image/pjpeg
Date:Wed, 07 Mar 2012 13:40:26 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

UPDATE 2

转向回收仍然没有提供太多,但是我已经将我的MaxWorkerProcess增加到8,并且我现在得到的错误数量比以前少了.

但平均而言,在一秒内的200个请求中,有2到10个请求失败.这种情况几乎每隔一秒就会发生一次.

UPDATE 3

继续有5%的请求失败并显示"服务器违反了协议.节=ResponseStatusLine",我有另一个程序从使用WebClient的Web服务器下载内容,这给出了这个错误每秒4-5次,平均有5%的请求失败.是否有任何方法可以跟踪WebClient故障?

Problems Redefined

Zero Byte File Received

IIS由于某种原因关闭了连接,在WebConfig的客户端,我收到的文件是0字节,不是0字节,我们做了SHA1散列判断,这告诉我们在IIS Web服务器中,没有记录错误.

这是我的错误,当我们使用实体框架时,它被解决了,因为读取不在事务范围内,所以它正在读取脏的(未提交的行),把它放在事务范围内解决了这个问题.

Protocol Violation Exception Raised

WebClient抛出WebException,说"服务器违反了协议.Section=ResponseStatusLine.

我知道我可以启用不安全的报头解析,但这不是重点,当是我的HTTP处理程序发送正确的报头时,我不知道为什么IIS会发送任何额外的东西(在Firefox和Chrome上判断,没有什么异常),这种情况只会发生2%的情况.

UPDATE 4

发现sc-Win32 64错误,我在某处读到MinBytesPerSecond的WebLimits必须从240更改为0,但一切仍然相同.但是,我注意到,每当IIS记录64个sc-win32错误时,IIS都会将HTTP状态记录为200,但是出现了一些错误.现在我不能打开200的失败跟踪日志(log)记录,因为它会导致大量文件.

以上两个问题都通过增加MinBytesPerSecond和禁用会话得到了解决,我添加了详细的答案,总结了每一点.

推荐答案

虽然在IIS中传递大文件的正确方式是以下选项,

  1. 在WebLimits中将MinBytesPerSecond设置为零(这肯定会有助于提高性能,因为IIS选择通过较小大小的传输关闭保持KeepAlive连接的客户端)
  2. 分配更多的工作进程到应用程序池,我已经设置为8,现在只有当您的服务器分发更大的文件时才应该这样做.这肯定会导致其他站点的运行速度变慢,但这将确保更好的交付.我们已经设置为8,因为此服务器只有一个网站,并且它只提供巨大的文件.
  3. 关闭应用程序池回收
  4. 关闭会话
  5. 使缓冲处于打开状态
  6. 在执行以下每个步骤之前,请判断响应是否正确.IsClientConnected是真的,否则放弃,不要发送任何东西.
  7. 在发送文件之前设置内容长度
  8. 刷新响应
  9. 写入输出流,并定期刷新

Asp.net相关问答推荐

DataTable 不包含 AsEnumerable 的定义

ASP.Net Core 2.1 中的身份< - 自定义 AccountController

Blazor 性能

用于 URL 的 Path.Combine?

C# ASP.NET Core Serilog 添加类名和方法到日志(log)

如何在 ASP.NET Core 中更改 Swagger 的基本 url

使用 ASP.NET Core 将 PDF 返回到浏览器

在 Asp.Net Core App 中访问 Web.config 设置?

如何提取自定义标头值?

ASP.NET Core 1.0 ConfigurationBuilder().AddJsonFile("appsettings.json");找不到文件

在 ASP.NET Core 中读取环境变量

如何在 Visual Studio 2015 中保存时编译 .sass 文件

您在 *nix 服务器上的 ASP.NET Core 生产环境中使用哪个 Web 服务器?

解析 JSON 响应的最简单方法

Visual Studio 2015 不是语法突出显示剃刀也不是 Intellisense

UseSqlServer 方法缺少 MVC 6

找不到路径的一部分... bin\roslyn\csc.exe

将 Grunt、Bower、Gulp、NPM 与 Visual Studio 2015 一起用于 ASP.NET 4.5 项目

如何在没有实体框架的情况下使用 ASP.NET Identity 3.0