hal*_*lei 8 .net c# windows-phone-8
我已经读过,为了在使用get和post方法时禁用缓存HttpClient,我需要使用a WebRequestHandler作为我HttpClient的HttpClientHandler,并更改其缓存策略.但是,WebRequestHandler不在System.Net.Http.dll中,而是在System.Net.Http.WebRequest.dll中,所以我尝试将.dll添加到项目中作为参考.我收到一条错误消息:
Microsoft Visual Studio
无法将对更高版本或不兼容程序集的引用添加到项目中.
再次,经过一点点搜索后,我得出结论,.dll文件被阻止,因为它是从另一个源下载的.为了解锁它,我继续在这里尝试解决方案.但是,它也没有工作,当我尝试添加.dll文件作为参考时,我仍然得到相同的错误.
我想要做的就是使用我的HttpClient禁用缓存,我在这里做错了吗?我愿意接受任何建议或帮助.
我的系统是Windows 8.1,我正在使用Visual Studio 2013.我正在开发的项目是Windows Phone 8应用程序.我试图引用的.dll目录是"C:\ Windows\Microsoft.NET\Framework\v4.0.30319\System.Net.Http.WebRequest.dll".先感谢您.
小智 27
在Windows Phone 8项目中引用常规.NET程序集是不可能的.您只能使用.NET API for Windows Phone.这是常规.NET的一个子集.有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207211%28v=vs.105%29.aspx.
可以通过向查询字符串附加值来解决HttpClient(和HttpWebRequest)的默认缓存.例如,一个guid.
string uri = "http://host/path?cache=" + Guid.NewGuid().ToString();
Run Code Online (Sandbox Code Playgroud)
如上面的注释中指出的更好的解决方案是设置"If-Modified-Since"标头.HttpWebRequest内置它:
HttpWebRequest request = HttpWebRequest.CreateHttp(url);
if (request.Headers == null)
request.Headers = new WebHeaderCollection();
// Make sure that you format time string according RFC.
// Otherwise setting header value will give ArgumentException for culture like 'ti-ER'
request.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString("r");
Run Code Online (Sandbox Code Playgroud)
但是你可以使用HttpClient手动添加标题.
如果使用Windows.Web.Http.HttpClient,从客户端修复此问题的简洁方法是:
var httpFilter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter();
httpFilter.CacheControl.ReadBehavior =
Windows.Web.Http.Filters.HttpCacheReadBehavior.MostRecent;
var httpClient = new Windows.Web.Http.HttpClient(httpFilter);
Run Code Online (Sandbox Code Playgroud)
这样,在使用随机查询字符串时,您可以避免使用临时文件填充应用程序的缓存.每个响应都存储在缓存中.
当然,始终建议从服务器端解决问题.添加以下标头,您无需担心每个客户端上的缓存:
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)
完整回复:
HTTP/1.1 200 OK
Content-Length: 31
Content-Type: text/plain; charset=UTF-8
Cache-Control: no-cache
...
Run Code Online (Sandbox Code Playgroud)
我找到了三种方法
string uri =" http://host.com/path?cache= "+ Guid.NewGuid().ToString();
Run Code Online (Sandbox Code Playgroud)var __request = (HttpWebRequest)WebRequest.Create(url.ToString()); if (__request.Headers == null) __request.Headers = new WebHeaderCollection(); __request.Headers.Add("Cache-Control", "no-cache");
Run Code Online (Sandbox Code Playgroud)[AspNetCacheProfile("GetContent")] public ResultABC GetContent(string abc) { __request = (HttpWebRequest)WebRequest.Create(abc); return __request; }
并更新您的web.config
Run Code Online (Sandbox Code Playgroud)<system.web> <caching> <outputCache enableOutputCache="true" /> <outputCacheSettings> <outputCacheProfiles > <add name="GetContent" duration="0" noStore="true" location="Client" varyByParam="" enabled="true"/> </outputCacheProfiles> </outputCacheSettings> </caching> ... </system.web>
我写了一个HttpMessageHandler基于上面的解决方案:
public class BypassCacheHttpRequestHandler : HttpClientHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.Headers.IfModifiedSince == null)
request.Headers.IfModifiedSince = new DateTimeOffset(DateTime.Now);
return base.SendAsync(request, cancellationToken);
}
}
Run Code Online (Sandbox Code Playgroud)
使用new HttpClient(new BypassCacheHttpRequestHandler(), true);初始化你HttpClient,那么你总是可以绕过缓存.
小智 5
这为Windows手机获取新数据而不是捕获数据
Using(HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.IfModifiedSince = DateTimeOffset.Now;
//your code goes here`enter code here`
}
Run Code Online (Sandbox Code Playgroud)
设置了另一种选择
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Run Code Online (Sandbox Code Playgroud)
在服务器页面Page_Load中,如果你从aspx页面获取数据
| 归档时间: |
|
| 查看次数: |
10550 次 |
| 最近记录: |