2012-10-02 98 views
3

我想緩存從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; 
} 

由於對象還包含響應流I這裏面臨着同樣的問題。

如何緩存?

回答

3

A Stream,而不是存儲桶。如果您需要存儲它,您必須先獲取實際內容。例如,您可以將其全部讀入byte[]。例如:

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

您可以輕鬆地存儲byte[]。然後,如果您稍後需要Stream,則可以使用new MemoryStream(payload)

+0

+1我打算輸入完全一樣的東西,你可能想包括如何複製[WebHeaderCollection](http://msdn.microsoft.com/en-us/library/system.net.WebHeaderCollection %20.aspx)'HttpWebRequest.Headers'也指向。另外,他的「容器」結構本身可以保存內存流,不需要複製到數組中。 –

2

您可以創建一個自定義類,它包含一個用於存儲數據的字節數組和另一個用HttpWebRequest.Headers作爲標題的字段?然後緩存。