2010-05-13 25 views
7

在我的ASP.NET应用程序中,我使用HttpWebRequest来获取我想要缓存的外部资源。请看下面的代码:如何强制HttpWebRequest在ASP.NET环境中使用缓存?

var req = WebRequest.Create("http://google.com/"); 
req.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable); 
var resp = req.GetResponse(); 
Console.WriteLine(resp.IsFromCache); 
var answ = (new StreamReader(resp.GetResponseStream())).ReadToEnd(); 
Console.WriteLine(answ.Length); 

HttpWebRequest的使用IE缓存,所以当我运行它作为普通用户(在微小的CMD测试程序),数据缓存到%userprofile%\Local Settings\Temporary Internet Files和明年响应从缓存中读取。

我认为,当这样的代码是ASP.NET应用程序中运行,数据将被缓存到...\ASPNET\Local Settings\Temporary Internet Files但它不是,并且永远不会使用的缓存。

我做错了什么?如何强制HttpWebRequest在ASP.NET环境中使用缓存?

+0

什么帐户下运行的ASP.NET应用程序?缓存将在该帐户下创建。 – feroze 2010-05-13 20:49:06

+0

@feroze:该应用程序在ASPNET帐户下运行,我知道检查Environment.SpecialFolder.InternetCache的临时Internet文件路径。 问题不在于我不知道缓存项的创建位置,而是根本不创建它们。 – piotrsz 2010-05-15 10:35:11

+0

你可以添加一行来关闭并处理响应对象:resp.Close();然后检查你是否仍然有问题? – feroze 2010-05-19 01:27:07

回答

0

我可能是错的,但我会怀疑HttpWebRequest方面从资源缓存头不管你陈述的欲望。

检查响应头并确保资源没有明确要求不被缓存。

+1

我也怀疑标题太多,所以我建立了一个小的cmd应用程序,使httprequest到同一个资源。在cmd应用程序中它被缓存。而在ASP.NET应用程序中则不是。 – piotrsz 2010-05-13 12:14:47

1

您可以手动使用缓存在你的代码是这样的:

Cache.Insert("request", req, Nothing, DateTime.Now, TimeSpan.FromSeconds(30), TimeSpan.Zero) 

您可以使用此方法,就像您在web.config中使用缓存有。

+0

我可能会实现自定义缓存,但我希望有一些简单的“开箱即用”解决方案... – piotrsz 2010-05-15 10:37:08

+0

我认为您的问题没有开箱即用,但这不应该是一个大问题实行。 – MUG4N 2010-05-15 10:57:15

1

我知道这是一个旧线程,但有关此问题需要考虑的另一件事是ASP.NET应用程序运行的用户帐户的IE安全设置。在将远程主机添加到“受信任的站点”列表之前,HTTP缓存(CachePolicy.Level = Default,HTTP缓存资源)不适用于我们的应用程序。

这篇文章是对我们的缓存有助于故障排除:http://blogs.msdn.com/b/ieinternals/archive/2011/03/19/wininet-temporary-internet-files-cache-and-explorer-folder-view.aspx