Windows Phone 8中没有HttpClient缓存

hal*_*lei 8 .net c# windows-phone-8

我已经读过,为了在使用get和post方法时禁用缓存HttpClient,我需要使用a WebRequestHandler作为我HttpClientHttpClientHandler,并更改其缓存策略.但是,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手动添加标题.

  • 请注意,您应该使用`DateTime.UtcNow.ToString("r");`以便根据RFC正确格式化时间戳. (2认同)

kie*_*wic 8

如果使用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)


R00*_*0We 7

我找到了三种方法

  1. 在URI的末尾添加一个随机查询字符串(想想Guid.NewGuid()),这样可以避免在客户端上进行缓存,因为查询字符串每次都会有所不同

string uri =" http://host.com/path?cache= "+ Guid.NewGuid().ToString();

  1. 在WCF服务操作中的OutgoingResponse标头中指定无缓存:
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)
  1. 使用AspNetCacheProfile属性标记您的服务操作:
[AspNetCacheProfile("GetContent")]  
public ResultABC GetContent(string abc)  
{  
  __request = (HttpWebRequest)WebRequest.Create(abc);
  return __request;  
}
Run Code Online (Sandbox Code Playgroud)

并更新您的web.config

<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>
Run Code Online (Sandbox Code Playgroud)


Sim*_*han 5

我写了一个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页面获取数据