将流存储在缓存中

时间:2012-10-02 13:46:20

标签: c# caching

我想缓存从HttpWebRequest获得的响应。我需要ResponseStream和标头。在创建请求时使用HttpRequestCachePolicy(HttpCacheAgeControl.MaxAge, TimeSpan.FromDays(1))似乎不起作用(IsFromCache由于某种原因从来都不是真的),而且我有点害怕手动缓存整个HttpWebResponse,因为它包含一个gzip压缩数据流,而我关于在ASP.NET缓存中存储流的感觉很糟糕。

响应映射到这样的对象(简化):

public readonly Stream Response;
public readonly string Etag;

private MyObject(Stream response, string etag)
{
    this.Response = response;
    this.Etag = etag;
}

由于该对象还包含响应流,因此我面临同样的问题。

如何缓存此内容?

2 个答案:

答案 0 :(得分:4)

Stream管道,而非存储桶。如果您需要存储它,您必须首先获得实际内容。例如,您可以将其全部读入byte[]。例如:

using(var ms = new MemoryStream()) {
    response.CopyTo(ms);
    byte[] payload = ms.ToArray();
}

您可以轻松存储byte[]。然后,如果您希望稍后Stream,则可以使用new MemoryStream(payload)

答案 1 :(得分:2)

您是否可以创建一个自定义类,其中包含用于存储数据的字节数组,另一个字段包含用于标头的HttpWebRequest.Headers?然后缓存那个。