6

使用HttpClientHttpResponseMessage时,与WebResponse.IsFromCache等效的是什么?

我可以查看响应中的一些 HTTP 标头吗?

4

3 回答 3

2

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

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

于 2014-01-02T21:50:22.297 回答
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

这些选项都不是那么抱歉,因此我最初的问题是,你想达到什么目的?

于 2013-01-01T01:48:02.127 回答
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)

为了验证响应消息的来源,我比较了第HttpResponseMessage.Headers.Date1 步和第 2 步的值(如果响应来自客户端缓存,这将是相同的)。对于我的第三步,我可以重新使用第一步中的客户端并将任意字符串附加到 URL。

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

于 2019-12-05T19:57:02.793 回答