Domanda

Ho effettuato l'accesso al sito con il mio browser web e ogni volta che provo a chiamare

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

o

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

Response.Write mi restituisce la pagina di login.

C'è lontano da allegare utente SessionId a WebClient o XmlTextReader o come posso richiedere un'altra pagina in C # con l'attuale utente connesso?

È stato utile?

Soluzione

È necessario utilizzare un oggetto in grado di gestire la memorizzazione dei cookie. In questo caso, è necessario il HttpWebRequest di classe. Avrete anche bisogno di un CookieContainer per gestire i cookie di autenticazione.

Per fare questo si farebbe:

  1. Creare un oggetto WebClient (un vaso di biscotto) che è possibile tenere traccia di tutta la portata di ogni richiesta effettuata.
  2. Crea un ResponseHeaders che accede al sito si sta accedendo.
  3. Utilizza il <=> creato nel passaggio 1 per ogni richiesta successiva.

Di seguito è riportato un esempio di come utilizzare il HttpWebRequest , HttpWebResponse , e CookieContainer classi insieme per fare una semplice richiesta che imposterà alcuni cookie, e quindi utilizzando quei biscotti su una successiva richiesta. Il resto dovrebbe essere facile supponendo tutto è ben formata markup;)

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

Un'altra opzione (se davvero si vuole utilizzare la classe <=>) sarebbe quello di analizzare il <=> proprietà della classe una volta che hai fatto la tua richiesta e includono i cookie appropriati nella vostra richiesta successiva. Questo è un po 'più coinvolto anche se dal momento che richiede di gestire i cookie manualmente.

Dal momento che sto supponendo che si vuole essere in grado di attraversare le risposte web in formato XML, vi consiglio di guardare nella libreria open source, HtmlAgilityPack . Esso permette di inviare nel markup da un sito web che è (molto probabilmente) non ben formato, o ha una sorta di codice non valido in esso, e poi fissa le parti non validi in modo che si può attraversarlo come XML.

Altri suggerimenti

Mentre si fa un po 'di screen scraping, ho avuto lo stesso problema. Mi chiedeva un'applicazione Classic ASP su un server IIS (potrei dire per alcune delle intestazioni che il server reponded con). Il modo in cui ho sostenuto una sessione in corso è stato di attivazione dei cookie sul WebClient. Theres nessuna commutazione per esso, si deve creare una sottoclasse WebClient per farlo funzionare.

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

Nota: questa non è una soluzione unica, ho trovato questo fuori là sul web me stesso, ma ho implementato la soluzione e funziona davvero bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top