我正在使用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 - 它可以在此实现下工作。
答案 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部分内容响应的最重要规则:
ETag
或Last-Modified
标题不完全匹配,Range
和Content-Range
标头的缓存不得缓存206个响应总结一下,您不需要使用varyByHeader
,因为遵循HTTP协议的每个缓存都知道在 206部分内容的情况下,Range
和{ {1}}标题是变体的一部分。