.net – WinInet如何确定缓存的内容和时间?
|
我正在试验我的.NET客户端和服务器之间的缓存.在WinInet决定缓存结果之前,我看到一个看似随机的端点命中数. .NET客户端使用HttpWebRequest发出请求: HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uiTextBoxUrl.Text); var policy = new RequestCachePolicy(RequestCacheLevel.CacheIfAvailable); webRequest.CachePolicy = policy; WebResponse webResponse = webRequest.GetResponse(); 使用ASP.net Web API实现的服务器设置这些CacheControl标头: response.Headers.CacheControl = new CacheControlHeaderValue
{
MaxAge =3600,MustRevalidate = true,Public = true,Private = true
};
使用带有将请求发送到端点的按钮的测试工具,我可以看到,即使使用了CacheIfAvailable,也不会立即缓存响应.通过检查我的服务器上的调试输出,我发现在最终缓存请求之前需要触发看似随机数量的命中(或者更可能是命中计数/经过时间启发式).如果我快速敲击测试按钮,它将在大约10次点击后开始缓存.如果我每隔1或2秒点击一次按钮,我就会计算出最多25次点击,然后再进行缓存. 这是我从Fiddler看到的回应: HTTP/200 responses are cacheable by default,unless Expires,Pragma,or Cache-Control headers are present and forbid caching.
HTTP/1.1 Cache-Control Header is present: public,must-revalidate,max-age=3600,private
private: This response MUST NOT be cached by a shared cache.
public: This response MAY be cached by any cache.
max-age: This resource will expire in 1 hours. [3600 sec]
must-revalidate: After expiration,the server MUST be contacted to verify the freshness of this resource.
HTTP/1.1 ETAG Header is present: "3488770a-8659-4fc0-b579-dcda9200a1c7"
我已经读过HttpWebRequest使用WinInet进行缓存,所以我很好奇WinInet如何确定什么时候需要缓存,更具体地说,为什么它不会在第一次打击时缓存? 解决方法我使用RequestCacheLevel.Default,否则我发现Wininet会愉快地提供陈旧的响应.我也不使用must-revalidate,因为我认为一旦缓存的响应失效,这是默认行为. 我相信如果您在请求中始终包含LastModifed或Etag,那么默认情况下您将获得本地副本,直到它已过期(因为您设置了Private和MaxAge),一旦它已经过期,那么您可能会得到304返回,在这种情况下它将使用本地副本. 说完所有这些后,请检查您对不同标题的回复.在许多情况下,Vary标头会阻止使用Wininet,因为它不能正确支持变换标头. 使用这个控制器, public class PrivateCachingController : ApiController
{
public HttpResponseMessage Get()
{
var response = new HttpResponseMessage()
{
Content = new StringContent("This is cached content")
};
response.Headers.CacheControl = new CacheControlHeaderValue() {MaxAge = new TimeSpan(0,60)};
return response;
}
}
和这个客户端代码, var clientHandler = new WebRequestHandler();
clientHandler.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default);
var client = new HttpClient(clientHandler) { BaseAddress = _BaseAddress };
var response = await client.GetAsync("/PrivateCaching");
var response2 = await client.GetAsync("/PrivateCaching");
执行时,网络上只发出一个请求. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 如何将转发器中Item的客户端ID传递给javascript
- 如何实现ASP.NET购物车?
- asp.net-mvc-3 – 为什么在使用Azure缓存(.NET MVC3应用程序
- asp.net-mvc – 在asp.net mvc主页面的导航列表中添加“活动
- asp.net-mvc-3 – 将输入值传递给Action(ASP.Net MVC 3)
- asp.net-mvc – Razor中的Direct Model.Property与Html Hel
- asp.net-mvc – ASP.NET MVC Beta 1:DefaultModelBinder错
- asp.net-mvc – 如何使用wmd-editor控件检索markdown和html
- asp.net-mvc – 使用部分页面的PagedList.MVC中的Ajax分页
- 如何在ASP.NET MVC中配置3个级别的URL?
- asp.net-mvc – 如何将模型传递给部分视图
- asp.net-mvc-5 – ASP.NET MVC中Controller的模型
- ASP.NET;几个会话变量或“容器对象”?
- 如何在ASP.NET MVC中扩展ValidationSummary HTML
- asp.net-mvc – Mvc 3 Razor:使用部分部分视图?
- asp.net-mvc – 将HTML.EditorFor转换为下拉列表
- Azure上的Asp.Net Core 2.0产生了502.5
- asp.net-mvc-3 – Azure网站上的RavenDb – 访问
- ASP.NET MVC中的“Generic”OpenID 5
- asp.net中XML如何做增删改查操作
