Pergunta

Eu tenho ligado para o site com o meu webbrowser e sempre que eu tento chamar

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 retorna a página de login.

Existe afastado para anexar usuário SessionId para WebClient ou XmlTextReader ou como posso solicitar outra página em C # com usuário conectado atual?

Foi útil?

Solução

Você vai precisar usar um objeto que pode lidar com os cookies que armazenam. Neste caso, você vai precisar do HttpWebRequest classe. Você também vai precisar de uma CookieContainer para gerenciar cookies de autenticação.

Para fazer isso você:

  1. Criar um objeto CookieContainer (a botija) que você pode manter o controle de todo o escopo de cada pedido que você faz.
  2. Criar um HttpWebRequest que se conecta ao site que você está acessando.
  3. Use o CookieContainer você criou na etapa 1 para cada pedido posterior.

A seguir é um exemplo de como usar a HttpWebRequest , HttpWebResponse , e CookieContainer aulas juntos para fazer um simples pedido nesse conjunto vontade alguns biscoitos, e em seguida, usando esses cookies em um posterior pedido. O resto deve ser fácil assumir marcação tudo está bem 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();

Outra opção (se você realmente quer usar a classe WebClient) seria para analisar o imóvel ResponseHeaders da classe, uma vez que você fez o seu pedido e incluir os biscoitos apropriados no seu próximo pedido. Este é um pouco mais envolvidos, embora uma vez que exige que você gerencie seus cookies manualmente.

Desde que eu estou supondo que você quer ser capaz de atravessar suas respostas web como XML, eu sugiro que você olhar para a biblioteca de código aberto, HtmlAgilityPack . Ele permite que você envie na marcação de um web site que é (muito provavelmente) não bem formado, ou tem algum tipo de marcação inválida nele, e então corrige as partes inválidos para que você possa atravessá-lo como XML.

Outras dicas

Ao fazer alguns screen scraping, eu tive o mesmo problema. Eu estava solicitando um aplicativo ASP clássico em um servidor IIS (eu poderia dizer por alguns dos cabeçalhos que o servidor reponded com). A maneira que eu apoiado uma sessão em curso era de ativar os cookies no WebClient. Não há nenhuma alternância para isso, você tem que subclasse WebClient para obtê-lo a trabalhar.

    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: esta não é uma solução única, achei que esta lá fora, na web eu mesmo, mas eu implementou a solução e ele funciona muito bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top