当使用HttpClient和HttpResponseMessage时,WebResponse.IsFromCache的等效内容是什么?
我能否查看响应中的某个HTTP头?
我能否查看响应中的某个HTTP头?
请注意:Windows.Web.Http HttpClient(一个类似的API,面向Windows 8.1应用程序开发)包括一个HttpResponseMessage.Source字段,指定结果来自何处(常见值为“cache”和“network”)。
Windows.Web.Http类可从C#和其他.NET语言,从C ++以及从JavaScript(在像从Windows应用商店运行的WwaHost应用程序中运行时)中使用。
请问您想要实现什么目标?是想避免缓存吗?
我之所以这样问,是因为我查看了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
很抱歉,这两个选项都不是很好,这也是我最初提出问题的原因,你想要实现什么目标?
最近我也一直在应对这种情况。
我需要进行集成测试以验证:
我最终采取了双重检查的方法:
使用非缓存 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.Date
值(如果响应来自客户端缓存,则这两个值将相同)。对于第三步,我可以重复使用第一步中的客户端,并在URL后附加任意字符串。