Pregunta

He iniciado sesión en el sitio con mi navegador web y cada vez que intento llamar

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 me devuelve la página de inicio de sesión.

¿Hay distancia para unir usuario SessionId al cliente Web o XMLTextReader o cómo puedo solicitar otra página en C # con el actual usuario registrado?

¿Fue útil?

Solución

Usted tendrá que utilizar un objeto que puede manejar las cookies que almacenan. En este caso, tendrá la HttpWebRequest clase. Usted también necesitará un CookieContainer administrar las cookies de autenticación.

Para hacer esto lo haría:

  1. Crea un objeto WebClient (un tarro de galletas) que puede realizar un seguimiento de largo alcance de cada solicitud que realice.
  2. Crear una ResponseHeaders que se registra en el sitio al que está accediendo.
  3. Utilice el <=> creó en el paso 1 para cada solicitud posterior.

A continuación se muestra un ejemplo de cómo utilizar el HttpWebRequest , HttpWebResponse , y CookieContainer clases juntos para hacer una simple petición que establecerá algunas cookies y, a continuación, utilizando esas galletas en una solicitud posterior. El resto debe ser suponiendo fácil todo está marcado bien formado;)

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

Otra opción (si realmente desea utilizar la clase <=>) sería la de analizar la <=> propiedad de la clase una vez que haya realizado su petición e incluir las galletas apropiados en su siguiente solicitud. Esto es un poco más complicado, aunque ya que requiere para gestionar las cookies manualmente.

Desde que estoy asumiendo que usted quiere ser capaz de atravesar sus respuestas web como XML, le sugiero que busque en la biblioteca de código abierto, HtmlAgilityPack . Se le permite enviar en el marcado de un sitio web que es (lo más probable) no está bien formada, o tiene algún tipo de marcas inválidas en ella, y luego fija las partes no válidos para que pueda atravesarlo como XML.

Otros consejos

Mientras que hace algunos captura de imágenes, que tenía el mismo problema. Yo estaba solicitando una aplicación ASP clásico en un servidor IIS (Me di cuenta por algunos de los encabezados que el servidor reponded con). La forma en que apoyaba una sesión en curso fue al permitir cookies en el cliente Web. Theres ninguna palanca para ello, hay que subclase cliente Web para conseguir que funcione.

    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: esto no es una solución única, he encontrado este que hay en la web, pero me ha implementado la solución y funciona muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top