IIS应用请求路由将206部分内容改为200

cor*_*tez 5 iis cloud azure arr

我已经使用 IIS 重写规则和应用程序请求路由模块在 azure 云服务中设置了一个反向代理服务器(根据此处的说明。除了调用我为下载 mp4 文件而创建的端点外,一切都运行良好。这些端点当请求包含 Range 标头时,可以提供部分内容。我遇到的问题是,当我直接点击服务器时,它会正确响应 206(部分内容)和正确的字节范围,但有时当我点击端点通过代理服务器,它以 200 和完整的文件内容响应,这会导致 Chrome 中的视频播放错误。

示例: 当使用这样的请求直接访问服务器时:

GET server.domain.com/api/adFile/fileName with header: Range: bytes=168-3922822

我正确地收到了 206 响应。以下是响应中的一些相关标头:

  • 缓存控制:无缓存
  • 编译指示:无缓存
  • 内容长度:3922655
  • 内容类型:视频/mp4
  • 内容-MD5:f1+K8OT8TEjvtlPU5iUY8a==
  • 内容范围:字节 168-3922822/3922823
  • 过期时间:-1
  • 最后修改时间:2016 年 2 月 16 日,星期二 15:46:46 GMT
  • ETag:“0x8D336E86040C217”
  • 服务器:Microsoft-IIS/8.0
  • X-AspNet 版本:4.0.30319
  • X-Powered-By: ASP.NET

当通过反向代理访问服务器时,请求如下:

GET proxy.domain.com/api/adFile/fileName with header: Range: bytes=168-3922822

我错误地收到了 200 状态代码和完整的文件内容。以下是该响应的相关标头:

  • 缓存控制:无缓存
  • 编译指示:无缓存
  • 内容长度:3922823
  • 内容类型:视频/mp4
  • 内容-MD5:f1+K8OT8TEjvtlPU5iUY8a==
  • 过期时间:-1 最后修改时间:2016 年 2 月 16 日,星期二 15:46:46 GMT
  • ETag:“0x8D336E86040C217”
  • 服务器:Microsoft-IIS/8.5
  • X-AspNet 版本:4.0.30319
  • X-Powered-By: ASP.NET
  • X-Powered-By:ARR/3.0
  • X-Powered-By: ASP.NET

有什么方法可以修改代理行为以匹配主服务器的行为(即仅返回请求的部分内容)? 当请求的字节范围接近完整文件大小时,它似乎可能正在缓存文件内容并为所有内容提供服务。

cor*_*tez 1

事实证明,这个问题的修复并不涉及修改反向代理服务器。我的目标服务缺少一个响应标头,当端点能够提供部分内容时,这是必需的:Accept-Ranges 标头。我修改了端点以包含Accept-Ranges: bytes作为响应标头,这让客户端知道端点能够提供部分内容。无论请求的是部分内容还是完整内容,都会包含此响应标头。缺少此标头的事实一定是导致代理服务器无法正常工作,使其认为需要返回整个文件。无论如何,修复很简单,现在我的代理服务器正在愉快地处理部分内容的请求!