2010-12-16 18 views
18

Parece que el almacenamiento en caché HttpWebRequest en WP7 está habilitado de forma predeterminada, ¿cómo lo desactivo? Agregando un random param url + "? Param =" + RND.Next (10000) funciona, pero es bastante complicado y no estoy seguro si funcionará con todos los servidores.WP7 HttpWebRequest sin almacenamiento en caché

+0

encuentra un problema para este problema mediante el objeto HttpWebRequest? la respuesta actual proporcionada son todas las soluciones del lado del servidor. (a excepción de la marca de tiempo, que no me gusta) – invalidusername

+0

Por cierto, un buen parámetro es DateTime.Now.Ticks. Siempre cambiará y su tamaño es aceptable (al menos durante las primeras décadas :-)) – invalidusername

Respuesta

6

¿Cómo sabes que es el teléfono, no el servidor (o un proxy en algún lugar entre) que es el almacenamiento en caché?
¿Ha comprobado esto con Fiddler2 (o equivalente)?

¿Ha intentado configurar los encabezados para desactivar el almacenamiento en caché?
Algo así como:

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

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

No es el servidor, porque la misma URL se actualiza corectly en BlackBerry, iPhone y Android – Janci

+3

Cambiar los encabezados no funciona, desafortunadamente. – dethSwatch

+2

Me encontré con este problema con ReSTful end-point que estaba desarrollando para una aplicación WP7. Cambiar el servidor para garantizar que devuelve una respuesta con el encabezado "Cache-Control" establecido en "no-cache" resolvió este problema. – dwynne

0

Adición de números aleatorios no está mal y que va a funcionar. He usado el tiempo (en la llamada ajax). Fue colocado en la url como una carpeta.

+0

sí funciona por ahora, pero no estoy satisfecho con esto, y estoy buscando una mejor solución – Janci

+0

con un número aleatorio que podría obtener el mismo número pero con el tiempo (como ms desde la medianoche - 1 a 86 400 000) casi imposible. incluso puedes combinar estos dos. ¿Has probado con POST? –

-2

Sí es posible ... :) Me paso de una semana de experimento y la respuesta es muy simple:

 HttpWebRequest _webRequest = WebRequest.CreateHttp(_currentUrl); 

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

No resuelve el problema de caché .. –

+0

No resuelve el problema + arroja una excepción interna "no compatible". –

19

Para referencia futura, esto funcionó para mí (que no podía usar parámetro de consulta adicional debido a los requisitos del proyecto):

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

Funciona. No tengo idea por qué. –

+0

@Agent_L la solicitud se ve diferente para el cliente HTTP WP7 – SandRock

1

que hemos visto el mismo comportamiento con Silverlight alojado en Chrome.

Añadimos un "?nocache=" + DateTime.Now.Ticks.ToString() a nuestras URL de solicitud si queremos evitar el almacenamiento en caché.

11

En caso de HttpClient (portátil para Windows Phone) "Cache-Control": "no-cache" en el lado del servidor funciona solo algunas veces. Y no puedo agregar el valor aleatorio de la cadena de consulta a la llamada api RESTful también.

Solución de @frno funciona bien y parece que para HttpClient:

client.DefaultRequestHeaders.IfModifiedSince = DateTime.UtcNow; 

Gracias.

+1

Este fue el único método que me funciona también. Los otros encabezados de caché parecen no tener ningún efecto. –

+0

Muy buena solución, también para Windows 8.1 Store Universal apps. – NBoymanns

+0

Esto nos funcionaba, ahora lanza 304 de vez en cuando. –

1

me encontré con 3 formas

  1. Añadir una cadena de consulta aleatorio al final de su URI (piensa Guid.NewGuid()) esto va a evitar el almacenamiento en caché en el cliente como la cadena de consulta será diferente cada vez

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

  1. especificar que no hay memoria caché en la cabecera OutgoingResponse dentro de su operación de servicio de WCF:
var __request = (HttpWebRequest)WebRequest.Create(url.ToString()); 
if (__request.Headers == null) 
    __request.Headers = new WebHeaderCollection(); 
__request.Headers.Add("Cache-Control", "no-cache"); 
  1. Marque su operación de servicio con el atributo AspNetCacheProfile:
[AspNetCacheProfile("GetContent")] 
public ResultABC GetContent(string abc) 
{ 
    __request = (HttpWebRequest)WebRequest.Create(abc); 
    return __request; 
} 

y actualizar su 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> 
Cuestiones relacionadas