2010-11-22 35 views
5

J'essaie d'obtenir l'en-tête "Set-Cookie" ou d'accéder au conteneur de cookies, mais l'en-tête Set-Cookie n'est pas disponible. Le cookie se trouve dans l'en-tête de la réponse, mais il n'existe pas dans l'objet de demande du client. j'enregistre la pile ClientHttp en utilisantEn-tête HttpWebRequest et Set-Cookie dans la réponse non analysée (WP7)

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

Voici la réponse:

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> 

Mon code de rappel contient quelque chose comme:

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); 
} 

J'ai aussi essayé de regarder les en-têtes, mais L'en-tête Set-Cookie n'est pas non plus présent dans la réponse.

Des suggestions sur ce qui pourrait être le problème?

+0

L'en-tête "Set-Cookie" semble également absent de mes réponses HttpWeb sur WP7. – Curyous

Répondre

-1

Vous devez modifier la collection d'en-têtes directement. Quelque chose comme ceci:

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

request.BeginGetResponse(myCallback, request); 
+0

Si vous vouliez définir l'en-tête à quelque chose avant la demande, j'ai essayé cela en vain. –

6

Essayez de passer explicitement une nouvelle 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

Pouvez-vous m'aider? Quelle est la fonction GetData() est? (dans votre dernière ligne) –

+0

'GetData' est une fonction fictive dans ce cas - vous pouvez simplement créer votre propre callback. –

0

Est-ce le cookie httponly? Si c'est le cas, vous ne pourrez pas le voir, mais si vous utilisez le même CookieContainer pour votre deuxième requête, la demande contiendra le cookie, même si votre programme ne pourra pas le voir.

2

Vous recevez les cookies HttpOnly:

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

Pour des raisons de sécurité, ces cookies ne sont pas accessibles à partir du code, mais vous pouvez toujours les utiliser dans vos prochains appels à HttpWebRequest. Plus à ce sujet ici: Reading HttpOnly Cookies from Headers of HttpWebResponse in Windows Phone

Avec WP7.1, j'ai également eu des problèmes de lecture des cookies non HttpOnly. J'ai découvert qu'ils ne sont pas disponibles si la réponse de HttpWebRequest provient du cache. Faire la requête unique avec un nombre aléatoire résolu le problème du cache:

// 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); 

Une fois que vous obtenez la réponse, vous pouvez chercher le cookie de l'en-tête de réponse:

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

Je ne ai jamais réussi à obtenir le CookieContainer Méthode .GetCookies() pour travailler.