【问题标题】:strange cache issue with HttpWebRequestHttpWebRequest 的奇怪缓存问题
【发布时间】: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 步)现在成功???

标签: asp.net httpwebrequest


【解决方案1】:

请尝试以下几行在HttpWebRequestWebResponse 中设置无缓存

请求

Request.Headers.Set(HttpRequestHeader.CacheControl, "max-age=0, no-cache, no-store");
Request.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore);

回应

Response.Headers.Add(HttpRequestHeader.CacheControl, "no-cache");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 2013-01-11
    • 2016-08-17
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多