使用WebResponse.IsFromCache和HttpClient时相当于HttpResponseMessage的内容是什么?
我可以看一下响应中是否有一些HTTP标头?
答案 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使用的最佳实践,但似乎可以在我的测试套件中解决这个问题。像上面提到的那样的显式属性将是更可取的,但似乎不可用。由于这里的最后一个答复已经有好几年了,可能会有更好的方法来解决此问题,但我想不到一个。