Question

Je suis connecté au site avec mon navigateur Web et chaque fois que je tente d'appeler

WebClient myWebClient = new WebClient();
string str = myWebClient.DownloadString("http://localhost/myxml.aspx");
Response.Write(str.ToString());

ou

XmlTextReader reader = new XmlTextReader(url);
while (reader.Read()) {
 Response.Write(reader.ReadOuterXml());
} 

Response.Write me retourne la page de connexion.

est-il loin de joindre l'utilisateur SessionId à WebClient ou XmlTextReader ou comment puis-je demander une autre page en C # avec l'utilisateur actuellement connecté?

Était-ce utile?

La solution

Vous aurez besoin d'utiliser un objet qui peut gérer les cookies de stockage. Dans ce cas, vous aurez besoin du HttpWebRequest classe. Vous aurez également besoin d'un CookieContainer pour gérer les cookies d'authentification.

Pour ce faire, vous devez:

  1. Créer un objet WebClient (un cookie jar) que vous pouvez garder une trace de toute la portée de toutes les demandes que vous faites.
  2. Créer un ResponseHeaders qui se connecte sur le site auquel vous accédez.
  3. Utilisez le <=> vous avez créé à l'étape 1 pour chaque requête.

Voici un exemple de la façon d'utiliser le HttpWebRequest , HttpWebResponse et les cours de CookieContainer ensemble pour faire une simple demande qui établira quelques biscuits, puis en utilisant ces cookies sur une demande ultérieure. Le reste devrait être facile à supposer que tout est bien formé le balisage;)

CookieContainer cookieJar = new CookieContainer();

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

var webResponse = webRequest.GetResponse();

using (var reader = new StreamReader(webResponse.GetResponseStream()))
{
    Response.Write(reader.ReadToEnd());
}

var anotherWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com/search?q=stackoverflow.com");
anotherWebRequest.CookieContainer = cookieJar;

webResponse = anotherWebRequest.GetResponse();

Une autre option (si vous voulez vraiment utiliser la classe <=>) serait d'analyser la propriété de la <=> classe une fois que vous avez fait votre demande et inclure les témoins appropriés dans votre prochaine demande. Ceci est un peu plus compliquée que puisqu'il vous oblige à gérer vos cookies manuellement.

Depuis que je suis en supposant que vous voulez être en mesure de parcourir vos réponses Web comme XML, je vous suggère de regarder dans la bibliothèque open source, HtmlAgilityPack . Il vous permet d'envoyer dans les balises d'un site Web qui est (le plus probable) pas bien formé, ou a une sorte de balise invalide dans, et fixe alors les parties non valides afin que vous puissiez parcourir comme XML.

Autres conseils

tout en faisant quelques screen scraping, j'eu le même problème. Je lui ai demandé une application ASP classique sur un serveur IIS (je pourrais dire par certains des en-têtes que le serveur reponded avec). La façon dont je soutenais une session en cours était en permettant des cookies sur le WebClient. Theres aucun basculement pour elle, vous devez sous-classe WebClient pour le faire fonctionner.

    public class CookieAwareWebClient : WebClient
    {
        protected CookieContainer _container = new CookieContainer();

        public CookieContainer Cookies
        {
            get { return _container; }
            set { _container = value; }
        }

        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest httpRequest = base.GetWebRequest(address) as HttpWebRequest;      

            if (httpRequest.CookieContainer != null)
            {
                if (httpRequest != null)
                {
                    CookieCollection newCookies = 
                        GetUniqueCookies(
                                address
                                ,httpRequest.CookieContainer.GetCookies(address)
                                );
                    foreach (Cookie c in newCookies)
                        httpRequest.CookieContainer.Add(c);
                }
            }
            else
                httpRequest.CookieContainer = this.Cookies;

            return (WebRequest)httpRequest;
        }

Remarque: ce n'est pas une solution unique, j'ai trouvé là-bas sur moi-même web, mais je l'ai mis en œuvre la solution et cela fonctionne très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top