web-dev-qa-db-fra.com

C # garder l'identifiant de session sur httpwebrequest

J'ai besoin de conserver le même identifiant de session lors de la navigation sur les pages d'un site à l'aide de C # .Net (comme un robot). J'ai trouvé quelques méthodes, un renifleur http était très pratique, pour comparer ce que mon IE navigateur envoyait (requête HTTP) et recevait du serveur Web (réponse HTTP), comme informations importantes se trouve dans les en-têtes (qui ne sont pas affichés par le navigateur). Veuillez ne pas confondre l'ID de session qui est public du serveur au navigateur, et les variables de session du serveur qui sont privées au code du serveur (comme php).

WebHeaderCollection headerCollection = new WebHeaderCollection();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
  /* save headers */
  for (int i = 0; i < response.Headers.Count; i++)
  {
     headerCollection.Add(response.Headers.AllKeys[i], response.Headers.Get(i));
  }
  /* save cookies */
  cookieContainer = new CookieContainer();
  foreach (Cookie cookie in response.Cookies)
  {
    cookieContainer.Add(cookie);
  }
}

pour faire l'autre GET ou POST demande:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
...
/* restore PHPSESSID */
for (int i = 0; i < headerCollection.Count; i++)
{
 string key = headerCollection.GetKey(i);
 if (key == "Set-Cookie")
 {
  key = "Cookie";
 }
 else
 {
  continue;
 }
 string value = headerCollection.Get(i);
 request.Headers.Add(key, value);
}
/* restore cookies */
request.CookieContainer = cookieContainer;
/* complete request */
Stream writeStream = request.GetRequestStream()

Ma demande est de contribuer avec un meilleur code, ou des idées supplémentaires pour faire une meilleure session de crawler en préservant.

27
artcoding

Si vous créez un seul conteneur de cookies et que vous l'assignez à votre première et à votre deuxième demande, vous n'aurez pas à faire tout ce qui est nécessaire pour copier les cookies de la réponse.

Lorsque les cookies sont définis par une réponse, le conteneur de cookies qui est joint à la demande recevra et stockera ces cookies. Ainsi, pour conserver le même contexte de session entre une série de demandes, il suffit de gérer une seule instance de conteneur de cookies et de l'utiliser avec toutes les demandes.

Votre code devient: -

cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
  // Do stuff with response
}

puis:-

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
...

request.CookieContainer = cookieContainer;
Stream writeStream = request.GetRequestStream()
56
AnthonyWJones