在ASP.NET MVC中混合OutputCache和动态范围请求

时间:2012-09-12 14:53:42

标签: asp.net asp.net-mvc jplayer lib.web.mvc

我正在使用RangeFilePathResult类来处理来自MVC控制器的mp3文件。

行动定义如下:

[CacheFilter]
[OutputCache(CacheProfile = "Mp3Cache")]
public RangeFilePathResult Mp3Completed(string f)
{
    FileInfo info = new FileInfo(string.Format("C:\\test\\{0}.mp3", f));
    return new RangeFilePathResult("audio/mpeg", info.FullName, info.LastWriteTimeUtc, info.Length);
}

缓存策略如下:

<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <add name="Mp3Cache" duration="3600" varyByParam="f" location="Any" />
    </outputCacheProfiles>
  </outputCacheSettings>
</caching> 

为什么这样可以正常工作?您似乎需要显式varyByHeader来确保范围请求与输出缓存一起使用?我正在解决的问题是iOS上的jPlayer无法显示MP3文件的持续时间,并且在与传统的FilePathResult一起提供时会呈现NaN - 它可以在此实现下工作。

1 个答案:

答案 0 :(得分:1)

最重要的是,范围请求的响应不是典型的 200 OK ,而是 206 Partial Content

如果 206部分内容,必须满足几个附加条件:

  • 请求必须包含指示所需范围的Range标头字段,并且可能包含If-Range标头字段以使请求成为条件
  • 响应必须包含Content-Range标头字段,表示此响应中包含的范围,或multipart/byteranges Content-Type包含每个部分的Content-Range字段。
  • 响应必须包含ETag和/或Content-Location(如果标题是在对同一请求的200响应中发送的话)
  • 回复必须包含Date

现在,支持HTTP协议的每个缓存机制(如果location="Any"这是浏览器,代理服务器和您的托管IIS)必须知道 206部分内容不同200 OK 并相应地对待它。您可以在下面找到缓存 206部分内容响应的最重要规则:

    如果ETagLast-Modified标题不完全匹配,
  • 缓存不得将206响应与其他先前缓存的内容合并
  • 不支持RangeContent-Range标头的缓存不得缓存206个响应

总结一下,您不需要使用varyByHeader,因为遵循HTTP协议的每个缓存都知道在 206部分内容的情况下,Range和{ {1}}标题是变体的一部分。