IIS 应用程序请求路由更改 206 部分内容为 200

IIS 应用程序请求路由更改 206 部分内容为 200

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

例子: 当直接向服务器发送如下请求时:

获取 server.domain.com/api/adFile/fileName 标头:范围:字节=168-3922822

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

  • 缓存控制:无缓存
  • 指令:无缓存
  • 内容长度:3922655
  • 内容类型:video/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 标头:范围:字节=168-3922822

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

  • 缓存控制:无缓存
  • 指令:无缓存
  • 内容长度:3922823
  • 内容类型:video/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

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

答案1

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

相关内容