5

Estoy tratando de obtener el encabezado "Set-Cookie" o acceder al contenedor de cookies, pero el encabezado Set-Cookie no está disponible. La cookie está en el encabezado de respuesta, pero no está allí en el objeto de solicitud del cliente. estoy registrando la pila ClientHttp usandoCabecera HttpWebRequest y Set-Cookie en respuesta no analizada (WP7)

bool httpResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp); 

Aquí está la respuesta:

HTTP/1.1 200 OK 
Content-Type: application/xml; charset=utf-8 
Connection: keep-alive 
Status: 200 
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.0.pre4 
ETag: "39030a9c5a45a24e485e4d2fb06c6389" 
Client-Version: 312, 105, 0, 0 
X-Runtime: 44 
Content-Length: 1232 
Set-Cookie: _CWFServer_session=[This is the session data]; path=/; HttpOnly 
Cache-Control: private, max-age=0, must-revalidate 
Server: nginx/0.7.67 + Phusion Passenger 3.0.0.pre4 (mod_rails/mod_rack) 

<?xml version="1.0" encoding="UTF-8"?> 
<user> 
... 
</user> 

Mi código de devolución de llamada contiene algo como:

var webRequest = (HttpWebRequest)result.AsyncState; 
raw = webRequest.EndGetResponse(result) as HttpWebResponse; 
foreach (Cookie c in webRequest.CookieContainer.GetCookies(webRequest.RequestUri)) 
{ 
    Console.WriteLine("Cookie['" + c.Name + "']: " + c.Value); 
} 

También he intentado mirar las cabeceras, pero El encabezado Set-Cookie tampoco está presente en la respuesta.

¿Alguna sugerencia sobre cuál puede ser el problema?

+0

Parece que también falta el encabezado "Set-Cookie" en mis HttpWebResponses en WP7. – Curyous

Respuesta

-1

Debe editar la colección de encabezados directamente. Algo como esto:

request.Headers["Set-Cookie"] = "name=value"; 

request.BeginGetResponse(myCallback, request); 
+0

Si quería decir configurar el encabezado a algo antes de la solicitud, lo intenté en vano. –

6

Trate de forma explícita aprobación de una nueva CookieContainer:

CookieContainer container = new CookieContainer(); 
container.Add(new Uri("http://yoursite"), new Cookie("name", "value")); 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://yoursite"); 
request.CookieContainer = container; 
request.BeginGetResponse(new AsyncCallback(GetData), request); 
+0

¿Me puedes ayudar? ¿Qué función es GetData()? (en su última línea) –

+0

'GetData' es una función ficticia en este caso; solo puede crear su propia devolución de llamada. –

0

Es la cookie httponly? Si es así, no podrá verlo, pero si usa el mismo CookieContainer para su segunda solicitud, la solicitud contendrá la cookie, aunque su programa no podrá verla.

2

Usted está recibiendo cookies HttpOnly:

Set-Cookie: _CWFServer_session=[This is the session data]; path=/; HttpOnly 

Por razones de seguridad, las galletas no se puede acceder desde el código, pero todavía se puede utilizar en sus próximas llamadas HttpWebRequest. Más sobre esto aquí: Reading HttpOnly Cookies from Headers of HttpWebResponse in Windows Phone

Con WP7.1, también tuve problemas para leer las cookies no HttpOnly. Descubrí que no están disponibles si la respuesta de HttpWebRequest proviene del caché. Hacer la consulta única con un número aleatorio resuelto el problema de caché:

// The Request 
Random random = new Random(); 
// UniqueQuery is used to defeat the cache system that destroys the cookie. 
_uniqueQuery = "http://my-site.somewhere?someparameters=XXX" 
     + ";test="+ random.Next(); 

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_uniqueQuery); 
request.BeginGetResponse(Response_Completed, request); 

Una vez que llegue la respuesta, se puede recuperar la cookie de las cabeceras de respuesta:

void Response_Completed(IAsyncResult result) 
{ 
    HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); 
    String header = response.Headers["Set-Cookie"]; 

nunca llegué a conseguir el CookieContainer El método .GetCookies() funciona.

Cuestiones relacionadas