如何使用HttpClient确定是否从缓存中实现了HttpResponseMessage

时间:2012-12-31 15:07:38

标签: c# .net http dotnet-httpclient

使用WebResponse.IsFromCacheHttpClient时相当于HttpResponseMessage的内容是什么?

我可以看一下响应中是否有一些HTTP标头?

3 个答案:

答案 0 :(得分:2)

仅供参考:Windows.Web.Http HttpClient(一个类似于Windows 8.1应用程序开发的API)确实包含一个HttpResponseMessage.Source字段,用于指定结果的来源(常用值为“cache”和“network”)。

Windows.Web.Http类可以从C#和其他.NET语言,C ++和JavaScript(当作为WwaHost应用程序(如Windows应用程序商店)运行时)使用。

答案 1 :(得分:1)

我可以问你想要达到的目标吗?试图避免缓存?

询问的原因是我查看了HttpClient(具体为HttpClientHandler)的源代码和HttpWebResponse的来源,我不相信您可以从中获取此信息头。

HttpClient / HttpClientHandler 在内部使用 HttpWebResponse,但公开HttpWebResponse的所有属性:

private HttpResponseMessage CreateResponseMessage(HttpWebResponse webResponse, HttpRequestMessage request)
{
      HttpResponseMessage httpResponseMessage = new HttpResponseMessage(webResponse.StatusCode);
      httpResponseMessage.ReasonPhrase = webResponse.StatusDescription;
      httpResponseMessage.Version = webResponse.ProtocolVersion;
      httpResponseMessage.RequestMessage = request;
      httpResponseMessage.Content = (HttpContent) new StreamContent((Stream) new HttpClientHandler.WebExceptionWrapperStream(webResponse.GetResponseStream()));

      //this line doesnt exist, would be nice
      httpResponseMessage.IsFromCache = webResponse.IsFromCache;// <-- MISSING!
     ...
 }

所以你看我的选择是:

a)查看HttpWebRequest的源代码以确定IsFromCache的逻辑,然后以某种方式将其改造为HttpClient(这可能甚至不可能,取决于实际的逻辑确实/需求)

b)要求ASP.NET团队将此属性包含在HttpResponseMessage中。或者直接作为财产,或者他们可以“保留”HttpWebResponse

这些选项都没有那么令人遗憾,因此我原来的问题是,你想要实现什么目标?

答案 2 :(得分:1)

最近我也在这种情况下苦苦挣扎。

我需要进行集成测试以验证:

  • 对新创建的资源的响应具有服务器设置的正确标头。
  • 对该资源的后续请求已从客户端缓存中完成。
  • 对现有资源的响应也由服务器设置了正确的标头。

我最终要做的是双重检查:

用于检查初始响应的非缓存HttpClient:

new WebRequestHandler
{
  AllowAutoRedirect = true,
  UseCookies = true,
  CookieContainer = new CookieContainer(),
  CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Refresh)
};

var client = new HttpClient(handler)

和第二个HTTP客户端来检查客户端缓存:

new WebRequestHandler
{
  AllowAutoRedirect = true,
  UseCookies = true,
  CookieContainer = new CookieContainer(),
  CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default)
};

var client = new HttpClient(handler)

要验证响应消息的来源,我比较了步骤1和2中的HttpResponseMessage.Headers.Date值(如果响应来自客户端缓存,则它们将是相同的)。对于我的第三步,我可以从第一步开始重复使用客户端,并将任意字符串附加到URL。

免责声明:这适用于.NET Framework 4.7,并且忽略了有关HttpClient使用的最佳实践,但似乎可以在我的测试套件中解决这个问题。像上面提到的那样的显式属性将是更可取的,但似乎不可用。由于这里的最后一个答复已经有好几年了,可能会有更好的方法来解决此问题,但我想不到一个。