Como posso ler em C # XML a partir de outra página enquanto estiver conectado ao site
-
21-08-2019 - |
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?
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ê:
- Criar um objeto
CookieContainer
(a botija) que você pode manter o controle de todo o escopo de cada pedido que você faz. - Criar um
HttpWebRequest
que se conecta ao site que você está acessando. - 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.