c# - Los encabezados HttpWebRequest y Set-Cookie en respuesta no se analizaron(WP7)
windows-phone-7 cookies (4)
Debe editar la colección de encabezados directamente. Algo como esto:
request.Headers["Set-Cookie"] = "name=value";
request.BeginGetResponse(myCallback, request);
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
usando
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 intenté mirar los encabezados, pero el encabezado Set-Cookie tampoco está presente en la respuesta.
¿Alguna sugerencia sobre cuál puede ser el problema?
Intente pasar explícitamente un nuevo 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);
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.
Usted está recibiendo cookies HttpOnly:
Set-Cookie: _CWFServer_session=[This is the session data]; path=/; HttpOnly
Por razones de seguridad, no se puede acceder a esas cookies desde el código, pero aún puede usarlas en sus próximas llamadas a HttpWebRequest. Más sobre esto aquí: Leer HttpOnly Cookies desde los encabezados de HttpWebResponse en Windows Phone
Con WP7.1, también tuve problemas para leer las cookies que no son solo HttpOnly. Descubrí que no están disponibles si la respuesta de HttpWebRequest proviene del caché. Hacer que la consulta sea única con un número aleatorio resolvió 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 obtenga la respuesta, puede obtener la cookie de los encabezados 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 logré que el método CookieContainer.GetCookies () funcionara.