簡體   English   中英

Windows Phone 8中沒有HttpClient緩存

[英]No cache with HttpClient in Windows Phone 8

我已經讀過,為了在HttpClient使用get和post方法時禁用緩存,我需要使用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”。 先感謝您。

在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();

如上面的注釋中所指出的,更好的解決方案是設置“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手動添加標題。

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

...

我找到了三種方法

  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"); 
  1. 使用AspNetCacheProfile屬性標記您的服務操作:
 [AspNetCacheProfile("GetContent")] public ResultABC GetContent(string abc) { __request = (HttpWebRequest)WebRequest.Create(abc); return __request; } 

並更新您的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> 

我根據上面的解決方案編寫了一個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);
    }
}

使用new HttpClient(new BypassCacheHttpRequestHandler(), true); 要初始化您的HttpClient您可以隨時繞過緩存。

這為Windows手機獲取新數據而不是捕獲數據

Using(HttpClient httpClient = new HttpClient())
{
    httpClient.DefaultRequestHeaders.IfModifiedSince = DateTimeOffset.Now;
    //your code goes here`enter code here`
}

設置了另一種選擇

Response.Cache.SetCacheability(HttpCacheability.NoCache);

在服務器頁面Page_Load中,如果你從aspx頁面獲取數據

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM