在 IIS 中使用 Response.BinaryWrite 时,HTTP 500 或响应缓冲区限制超出错误

本文可帮助你解决使用 Active Server Pages (ASP) 中的方法发送文件时发生的 Response.BinaryWrite 错误(HTTP 500 或超出响应缓冲区限制)。

原始产品版本: Internet Information Services、Active Server Pages (ASP)
原始 KB 数: 944886

现象

假设出现了下面这种情景:

  • 将文件从安装了 Internet Information Services (IIS) 的 Web 服务器发送到客户端计算机。
  • 使用 Response.BinaryWrite 该方法将文件发送到客户端计算机,并将 AspBufferingOn 属性设置为 False

在此方案中,你可能会在客户端计算机上收到以下错误消息之一:

  • 错误消息 1

    HTTP 500 - 内部服务器错误

  • 错误消息 2

    响应对象错误“ASP 0251 : 80004005”
    超出响应缓冲区限制
    执行 ASP 页会导致响应缓冲区超出其配置的限制。

此外,你可能会收到类似于 IIS 日志文件中的以下消息:

ASP_0251_:_80004005|Response_Buffer_Limit_Exceeded

原因

出现此问题的原因是,当禁用 ASP 响应缓冲时,IIS 强制使用默认的 ASP 响应缓冲区值 4 MB。

在大多数情况下,4 MB 缓冲区限制足以满足发送到 Web 客户端的 ASP 响应。 如果此限制不足,请使用以下方法之一。

解决方法 1:减小响应大小

若要在使用方法并关闭 ASP 缓冲时 Response.BinaryWrite 解决此问题,请验证返回给客户端的数据是否不超过 4 MB。

如果响应大于 4 MB 默认值,则此大小经常会导致用户体验不佳。 Web 浏览器必须通过网络接收大型响应。 然后,Web 浏览器必须分析和显示大型 HTML 响应。

解决方法 2:启用 ASP 响应缓冲并增加缓冲区限制

可以使用 AspBufferingOn IIS 元数据库属性在应用程序级别启用或禁用缓冲。

备注

在 IIS 中,可以使用文件或Web.config文件中 ASP 节ApplicationHost.config<System.webserver>中的值在应用程序级别bufferingOn启用或禁用 ASP 响应缓冲。

若要在页面级别启用或禁用缓冲,可以使用该 Response.Buffer 属性。

如果必须增加缓冲区限制,请选择允许最大已知响应大小的缓冲区限制。 如果事先不知道最大响应大小,则可以在测试期间将缓冲区限制增加到较大的值。 测试完成后,请使用 IIS 日志文件中 SC 字节 字段中显示的最大值,获取为页面生成的响应。

若要在 IIS 中增加缓冲限制,请执行以下步骤:

  1. 选择“ 开始”,选择“ 运行”,键入 cmd,然后选择“ 确定”。

  2. cd /d %systemdrive%\inetpub\adminscripts键入命令,然后选择 Enter

  3. cscript.exe adsutil.vbs SET w3svc/aspbufferinglimit LimitSize键入命令,然后选择 Enter

    备注

    LimitSize 表示缓冲限制大小(以字节为单位)。 例如,67108864数字将缓冲限制大小设置为 64 MB。

若要确认已正确设置缓冲区限制,请执行以下步骤:

  1. 选择“ 开始”,选择“ 运行”,键入 cmd,然后选择“ 确定”。
  2. cd /d %systemdrive%\inetpub\adminscripts键入命令,然后选择 Enter
  3. cscript.exe adsutil.vbs GET w3svc/aspbufferinglimit键入命令,然后选择 Enter

详细信息

使用 Response.BinaryWrite 方法和 ASP 响应缓冲处于禁用状态时,只能向客户端发送 4 MB 的数据,除非显式设置了页面的缓冲限制属性。 默认情况下,IIS 中属性的值 bufferLimit 为 4,194,304 字节。

此外,如果对客户端的响应大于缓冲区限制值, BinaryWrite() 即使 ASP 响应缓冲已关闭,API 也会失败。

备注

建议启用 ASP 响应缓冲。 ASP 响应缓冲可提高 Web 应用程序的性能。