2009-06-28 4 views
24

J'essaie de créer une session HttpWebRequest/HttpWebResponse avec un site Web ASP.NET pour analyser plus tard un formulaire HTML via les paramètres url (cette partie je sais comment faire), mais je ne comprends pas comment analyser et définir un cookie tel que l'identifiant de session. Dans Fiddler, cela montre que l'ID de session ASP.NET est renvoyé via Set-Cookie dans la réponse à la requête au/path de l'URL, mais comment puis-je extraire cet ID de session et le définir comme cookie pour le prochain HttpWebRequest? ? Je comprends que cet en-tête Set-Cookie se trouve dans HttpWebResponse.Headers.Keys, mais existe-t-il un chemin direct pour l'analyser? Merci!Comment analyser HttpWebResponse.Headers.Keys pour un ID de session Set-Cookie retourné

+1

Vous êtes les bienvenus! –

Répondre

54

Le framework .NET gérera les cookies pour vous. Vous n'avez pas à vous soucier d'analyser les informations de cookie des en-têtes ou d'ajouter un en-tête de cookie à vos demandes.

Pour stocker et envoyer votre ID de session, utilisez les classes Cookie et CookieContainer pour les stocker, puis assurez-vous d'envoyer vos cookies à chaque demande.

L'exemple suivant montre comment procéder. Le CookieContainer, 'cookieJar' peut être partagé entre plusieurs domaines et demandes. Une fois que vous l'ajoutez à un objet de requête, la référence à celui-ci sera également ajoutée à l'objet de réponse lorsque la réponse est renvoyée.

CookieContainer cookieJar = new CookieContainer(); 

var request = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com"); 
request.CookieContainer = cookieJar; 

var response = request.GetResponse(); 

foreach (Cookie c in cookieJar.GetCookies(request.RequestUri)) 
{ 
    Console.WriteLine("Cookie['" + c.Name + "']: " + c.Value); 
} 

La sortie de ce code sera:

Cookie['PREF']: ID=59e9a22a8cac2435:TM=1246226400:LM=1246226400:S=tvWTnbBhK4N7Tlpu

+0

Merci beaucoup! Cela m'aidera vraiment !!! Yay! :) –

+0

J'ai implémenté ceci, et ça marche! Merci beaucoup. –

+0

+1 Merci pour votre aide si appréciée! Je n'avais pas hâte d'analyser manuellement les en-têtes HTTP :) – jv42

7

La réponse de Dan Herbert m'a vraiment aidé. J'apprécie ton aide.

Je veux juste poster mon utilisation - j'espère que cela aidera quelqu'un à un moment donné. Mon exigence est que je dois renvoyer des cookies de la première réponse de poste http à la deuxième demande de poste http.

1er:

CookieContainer cookieJar = new CookieContainer(); 
request.CookieContainer = cookieJar; 
.... 

CookieCollection setCookies = cookieJar.GetCookies(request.RequestUri); 

2ème:

CookieContainer cc = new CookieContainer(); 
cc.Add(setCookies);  
request.CookieContainer = cc; 
1

hum je peux me tromper, mais de ce que j'observe ces derniers temps

Cookies d'une première réponse, ne comprennent pas le ' mettre cookie 'comme cookies qui viennent dans l'en-tête (par exemple un identifiant de session ...) dans le cas d'un statut 302 (redirection)

Si le autofollowredirect est réglé sur true, le cookie de jeu sont traitées et la demande ultérieure qui est fait automatiquement, comprendra ces cookies définis par cookie ensemble sur le premier appel

Si autofollowredirect est définie sur false alors la première demande ne reçoit pas les cookies positionnés par le cookie de jeu, et je suppose et c'est aussi mon queston si quelqu'un sait, que la seule façon d'avoir par la suite ces cookies dans la prochaine demande, est d'analyser les cookies?

+0

J'ai rencontré des problèmes avec une redirection 302 et j'ai défini AllowAutoRedirect = false. Cela m'a donné une réponse "cette page a déménagé", mais ensuite je passe les cookies et redirige vers la page que je voulais aller en premier lieu. – Daryl

+1

[Selon la RFC 6265] (http://tools.ietf.org/html/rfc6265#section-3) Les agents utilisateurs PEUVENT ignorer les en-têtes Set-Cookie contenus dans les réponses avec des codes d'état de 100 niveaux mais DOIVENT traiter Set-Cookie en-têtes contenus dans d'autres réponses (y compris les réponses avec 400- et les codes d'état de 500 niveaux). – Snives

5

J'ai le même problème (avec amazon) J'utilise l'expression régulière suivante:

string regexp = "(?<name>[^=]+)=(?<val>[^;]+)[^,]+,?";);
MatchCollection myMatchCollection = Regex.Matches(cookiesStr, regexp);
foreach (Match myMatch in myMatchCollection)
{
string cookieName = myMatch.Groups["name"].ToString();
string cookieVal = myMatch.Groups["val"].ToString();
Cookie cookie = new Cookie(cookieName, cookieVal);
cookies.Add(cookie);
}

Notez que je ne se soucient le nom du cookie/valeur ...

bonne chance Elia

+0

C'est le type exact de solution que je recherche (l'objet WebBrowser fournit uniquement une chaîne pour le cookie). Cependant, votre code ne compile pas. – Nuzzolilo