【发布时间】:2012-08-28 12:26:08
【问题描述】:
我们有一个网络应用程序,它调用外部搜索提供商的网址来加载搜索结果。每次我们的页面被点击时,它都可以传入一个当前页码。此页码包含在发送给第 3 方的 url 中。我注意到,虽然他们报告了 45 页的结果,但如果我转到包含他们结果的一个页面,然后尝试导航到另一个包含其他结果的页面,则会加载来自第一页的相同结果。
我尝试设置我的 HttpWebRequest 对象以禁用缓存,但我尝试的所有方法似乎都不起作用。而且,考虑到由于页码每次 url 都会发生变化,我不认为这真的是一个缓存问题。但这就是有趣的地方。
如果我复制我在代码中检索的 url 并将其粘贴到 chrome 中,它会加载正确的结果。然后我刷新 Web 应用程序页面,它现在也加载了该页面的结果。这对我来说毫无意义。代码是在本地运行的,但是由于是在asp.net中运行的,所以没有使用chrome来创建web请求,为什么会这样呢?
这是我调用 url 并返回结果的代码。
public static string FetchPage(string url)
{
//Specify the encoding
Encoding enc = System.Text.Encoding.GetEncoding(1252);
HttpWebRequest.DefaultCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default); ;
//Create the http request
var request = (HttpWebRequest)WebRequest.Create(url);
request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
//Create the http response from the http request
var httpWebResponse = (HttpWebResponse)request.GetResponse();
//Get the response stream
var responseStream = new StreamReader(httpWebResponse.GetResponseStream(), enc);
//Read the response stream
string htmlStream = responseStream.ReadToEnd();
//Close the web response
httpWebResponse.Close();
//Close the response stream
responseStream.Close();
return htmlStream;
}
【问题讨论】:
-
该方法本身看起来没问题,您传递给它以获取结果的 url 是什么。顺便说一句:如果您传递不同的网址(即您的页码是网址的一部分),那么您在任何情况下都不必担心缓存。如果您 NOT 在您的 url 中传递页码,您如何期望被调用的服务知道您正在请求哪个页面?如果您的 url DOES 改变了,请确保它改变了,而不是尝试通过浏览器或 telnet 直接查询服务。并确保阅读服务提供文档/规范 - 当您请求特定页面时,他们可能会期待一些其他值/变量
-
这就是我要说的。每个 url 中的页码确实会发生变化,所以这就是为什么我最初认为缓存不会成为问题的原因。正如我所说,我已经尝试直接查询服务,当我这样做时,然后刷新调用相同 url 的 web 应用程序页面,此时结果确实发生了变化。这没有任何意义。第 3 方已经确认我的 url 参数符合他们的规范,所以我在这里真的很困惑。
-
我知道它不会影响任何事情,但考虑到您描述问题的内容和方式,您是否检查了您的 IE(因为您正在运行 asp.net)互联网选项缓存设置?如果它们设置为自动(我认为这是 Winz IE 的默认设置)而不是将它们重置为“每次访问...”并确保您的 .net 框架是最新的,它总是有问题...试图理解 Winz 的功能总是很困难 - AFAIR IE 使用与 chrome 相同的临时 Internet 文件夹,这可以解释为什么 .net(通过 IE)正在查找要显示的缓存数据
-
只有在实时查看网络应用程序时,该问题才在 chrome 中被发现。所以浏览器运行在与应用程序完全不同的机器上。我什至将结果页面设置为不包含缓存标头......但没有运气。
-
到目前为止,我了解您的问题:1)您从在 PC1 上运行的应用(提供的代码)发送搜索服务请求,直接连接到互联网(不通过代理) -> 结果集包含结果的第 1 页 2) 您从相同的应用程序/相同的 PC1 发送下一个请求以获取结果的第 2 页,在 url 中指定页码 -> 结果集包含结果的第 1 页 [而不是第 2 页] 3) 您发送指定 url 的请求第 2 步)在 PC2 上使用 Chrome 浏览器直接连接到互联网(不通过代理)-> 结果集包含 page2 的结果 4)重新运行第 2 步)现在成功???