Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows Phone 8中的HttpClient没有缓存_C#_.net_Windows Phone 8 - Fatal编程技术网

C# Windows Phone 8中的HttpClient没有缓存

C# Windows Phone 8中的HttpClient没有缓存,c#,.net,windows-phone-8,C#,.net,Windows Phone 8,我已经了解到,为了在HttpClient中使用get和post方法时禁用缓存,我需要使用WebRequestHandler作为我的HttpClientHandler,并更改其缓存策略。但是,WebRequestHandler不在System.Net.Http.dll中,而是在System.Net.Http.WebRequest.dll中,因此我尝试将.dll添加到项目中作为参考。我收到一条错误消息: Microsoft Visual Studio 无法删除对更高版本或不兼容程序集的引用 添加到项

我已经了解到,为了在
HttpClient
中使用get和post方法时禁用缓存,我需要使用
WebRequestHandler
作为我的
HttpClientHandler
,并更改其缓存策略。但是,
WebRequestHandler
不在System.Net.Http.dll中,而是在System.Net.Http.WebRequest.dll中,因此我尝试将.dll添加到项目中作为参考。我收到一条错误消息:

Microsoft Visual Studio

无法删除对更高版本或不兼容程序集的引用 添加到项目中

再次,经过一点搜索,我得出结论说.dll文件被阻止了,因为它是从另一个源下载的。为了解除封锁,我继续尝试解决方案。但是,它也不起作用,当我尝试添加.dll文件作为引用时,仍然会遇到相同的错误

我想做的就是使用我的HttpClient禁用缓存,我在这里做错了什么吗?我愿意接受任何类型的建议或帮助


我的系统是Windows 8.1,我使用的是Visual Studio 2013。我正在做的项目是一个WindowsPhone8应用程序。我试图引用的.dll目录是“C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.NET.Http.WebRequest.dll”。提前感谢。

无法在Windows Phone 8项目中引用常规.NET程序集。您只能使用适用于Windows Phone的.NET API。这是常规.NET的子集。有关更多信息,请参阅

HttpClient(和HttpWebRequest)的默认缓存可以通过向查询字符串追加一个值来解决。例如,guid

string uri = "http://host/path?cache=" + Guid.NewGuid().ToString();
一个更好的解决方案,如上面评论中所指出的,是设置“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"); 

但是我想您可以使用HttpClient手动添加头。

我基于上述解决方案编写了一个
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);
    }
}
公共类绕过CacheHttpRequestHandler:HttpClientHandler
{
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
if(request.Headers.IfModifiedSince==null)
request.Headers.IfModifiedSince=新的DateTimeOffset(DateTime.Now);
返回base.sendaync(请求、取消令牌);
}
}
使用新的HttpClient(新的BypassCacheHttpRequestHandler(),true)初始化您的
HttpClient
,然后您可以随时绕过缓存。

我找到了3种方法

  • 将随机查询字符串添加到URI的末尾(想想Guid.NewGuid()),这将避免在客户端上缓存,因为每次查询字符串都会不同
  • 字符串uri=“”+Guid.NewGuid().ToString()

  • 在WCF服务操作中的OutgoingResponse标头中指定无缓存:
  • 使用AspNetCacheProfile属性标记服务操作:
  • 并更新您的web.config

    
    ...  
    

    如果使用
    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);
    
    这样,在使用随机查询字符串时,就避免了用临时文件填充应用程序的缓存。每个响应都存储在缓存中

    当然,始终建议从服务器端解决此问题。添加以下标头,您就不必担心每个客户端上的缓存:

    Cache-Control: no-cache
    
    全部答复:

    HTTP/1.1 200 OK
    Content-Length: 31
    Content-Type: text/plain; charset=UTF-8
    Cache-Control: no-cache
    
    ...
    

    这使windows phone能够获取新数据,而不是捕获数据

    Using(HttpClient httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.IfModifiedSince = DateTimeOffset.Now;
        //your code goes here`enter code here`
    }
    
    另一种选择是设置

    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    

    在服务器页面中,如果您从aspx页面获取数据,请加载。

    在请求标头中将ifModifiedSince标头设置为当前时间如何。.谢谢,添加ifModifiedSince标头似乎暂时有效。请注意,您应该使用
    DateTime.UtcNow.ToString(“r”)这样时间戳就可以按照RFC正确格式化了。你们救了我的命,我已经很久没把头撞到墙上了!最糟糕的是,这种自动缓存只在WP应用程序上处理,而不是在通用应用程序上处理,wtf?!此解决方案可能是针对Windows Phone的黑客攻击。我尝试在Xamarin应用程序(也适用于Windows Phone)中使用此选项,它导致服务器始终返回304 Not Modified响应,这是有意义的,因为如果服务器上存在任何类型的缓存,“立即”很少为真。最终对我起作用的是client.DefaultRequestHeaders.CacheControl=new CacheControlHeaderValue(){NoCache=true};选项2是避免从客户端缓存检索结果的正确方法。或者您可以只设置HttpClient.DefaultRequestHeader。另外,执行httpClient.DefaultRequestHeader.CacheControl=new CacheControlHeaderValue(){NoCache=true}更为正确;
    
    HTTP/1.1 200 OK
    Content-Length: 31
    Content-Type: text/plain; charset=UTF-8
    Cache-Control: no-cache
    
    ...
    
    Using(HttpClient httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.IfModifiedSince = DateTimeOffset.Now;
        //your code goes here`enter code here`
    }
    
    Response.Cache.SetCacheability(HttpCacheability.NoCache);