2010-12-16 17 views
18

Wygląda na to, że buforowanie HttpWebRequest w WP7 jest domyślnie włączone, jak mogę je wyłączyć? Dodanie losowego adresu URL param +?? Param = "+ RND.Next (10000) działa, ale jest dość trudne i nie jestem pewien, czy zadziała ze wszystkimi serwerami.WP7 HttpWebRequest bez buforowania

+0

Znaleziony problem dla tego problemu przy użyciu HttpWebRequest obiekt? bieżącą podaną odpowiedzią są wszystkie rozwiązania po stronie serwera. (z wyjątkiem sygnatury czasowej, której nie lubię) – invalidusername

+0

Btw, dobrym parametrem jest DateTime.Now.Ticks. Zawsze się to zmieni, a jego rozmiar jest akceptowalny (przynajmniej przez pierwsze kilka dekad :-)). – invalidusername

Odpowiedz

6

Skąd wiadomo, że to telefon, a nie serwer (lub proxy między nimi), który buforuje?
Sprawdziłeś to z Fiddler2 (lub odpowiednikiem)?

Czy próbowałeś ustawić nagłówki, aby wyłączyć buforowanie?
Coś jak:

myRequest = (HttpWebRequest)WebRequest.Create(myUri); 

myRequest.Headers["Cache-Control"] = "no-cache"; 
myRequest.Headers["Pragma"] = "no-cache"; 
+2

To nie jest serwer, ponieważ ten sam URL poprawia się poprawnie na BlackBerry, IPhone i Androidzie – Janci

+3

Zmiana nagłówków nie działa, niestety. – dethSwatch

+2

Wpadłem na ten problem z punktem końcowym ReSTful, który opracowałem dla aplikacji WP7. Zmiana serwera w celu zapewnienia, że ​​zwróci odpowiedź z nagłówkiem "Cache-Control" ustawionym na "brak pamięci podręcznej", rozwiązuje ten problem. – dwynne

0

Dodawanie liczb losowych nie jest źle i będzie działać. Użyłem Time (w wywołaniu ajax). Został umieszczony w adresie URL jak folder.

+0

tak to działa na razie, ale nie jestem z tego zadowolony i szukam lepszego rozwiązania – Janci

+0

z losową liczbą można uzyskać ten sam numer, ale z czasem (jak ms od północy - 1 do 86 400 000) Prawie niemożliwe. możesz nawet połączyć te dwa. czy próbowałeś z POST? –

-2

Tak jest możliwe ... :) I spędzić jeden tydzień eksperymentu i odpowiedź jest bardzo prosta:

 HttpWebRequest _webRequest = WebRequest.CreateHttp(_currentUrl); 

    _webRequest.AllowReadStreamBuffering = false 
_webRequest.BeginGetResponse(_onDownload, 
userState); 
+0

To nie rozwiązuje problemu z pamięcią podręczną. –

+0

Nie rozwiązuje problemu + zgłasza wewnętrzny wyjątek "nie jest obsługiwany". –

19

Na przyszłość, to pracował dla mnie (nie mogłem użyć dodatkowego parametru zapytania z powodu wymagania projektowe):

 HttpWebRequest request = HttpWebRequest.CreateHttp(url); 
     if (request.Headers == null) 
     { 
      request.Headers = new WebHeaderCollection(); 
     } 
     request.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString(); 
+1

Działa. Nie mam pojęcia dlaczego. –

+0

@Agent_L Żądanie wygląda inaczej dla klienta HTTP WP7 – SandRock

1

Obserwowaliśmy to samo zachowanie w Silverlight w Chrome.

Dodajemy "?nocache=" + DateTime.Now.Ticks.ToString() do naszych adresów URL żądań, jeśli chcemy zapobiec buforowaniu.

11

W przypadku HttpClient (Przenośny dla systemu Windows Phone) "Kontrola pamięci podręcznej": "brak pamięci podręcznej" po stronie serwera działa tylko czasami. I nie mogę dodać losowej wartości ciągu zapytania do wywołania RESTful api.

Rozwiązanie z @frno działa dobrze i wygląda na HttpClient:

client.DefaultRequestHeaders.IfModifiedSince = DateTime.UtcNow; 

Dziękuję.

+1

To była jedyna metoda, która działa również dla mnie. Inne nagłówki pamięci podręcznej wydają się nie mieć wpływu. –

+0

Bardzo dobre rozwiązanie, również dla Windows 8.1 Store Uniwersalne aplikacje. – NBoymanns

+0

To działało dla nas, od czasu do czasu rzucając 304s. –

1

znalazłem 3 sposoby

  1. Dodaj losowy ciąg kwerendy do końca swojego identyfikatora URI (myślę Guid.NewGuid()) to pozwoli uniknąć buforowanie na kliencie jako ciąg kwerendy za każdym razem będzie inaczej

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

  1. Określ nie cache w nagłówku OutgoingResponse ciągu operacji usługi WCF:
var __request = (HttpWebRequest)WebRequest.Create(url.ToString()); 
if (__request.Headers == null) 
    __request.Headers = new WebHeaderCollection(); 
__request.Headers.Add("Cache-Control", "no-cache"); 
  1. znacznik operacji usługi z atrybutem AspNetCacheProfile:
[AspNetCacheProfile("GetContent")] 
public ResultABC GetContent(string abc) 
{ 
    __request = (HttpWebRequest)WebRequest.Create(abc); 
    return __request; 
} 

i zaktualizować 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>