O código para preencher e enviar o formulário acima é o seguinte:
// URI string para enviar o formulário.
string uriString = " http://www.xxx.com/Login.aspx ";
// String de dados a serem enviados.
string postString = "userName=usuário1&senha=senha1";
//Inicializa WebClient
WebClient webClient = new WebClient();
webClient.Headers.Add("Tipo de conteúdo", "aplicativo/x-www-form-urlencoded");
//Converte string em array de bytes
byte[] postData = Encoding.ASCII.GetBytes(postString);
//Carrega os dados e retorna o array de bytes da página
byte[] responseData = webClient.UploadData(uriString, "POST", postData);
//Converte o array de bytes retornado em uma string (HTML)
string srcString = Encoding.UTF8.GetString(responseData);
srcStrinig é o HTML da página retornada após o envio do formulário. Que tal? É muito simples.
Porém, o código acima pode enviar o formulário gerado por ASP ou JSP, mas não pode enviar o formulário ASP.NET. Porque ao enviar um formulário ASP.NET, os valores devem ser atribuídos a "__VIEWSTATE" e "__EVENTVALIDATION". Os valores de "__VIEWSTATE" e "__EVENTVALIDATION" podem ser encontrados clicando com o botão direito em "Ver código-fonte" na página a ser submetida. do seguinte modo:
id="__VIEWSTATE" valor="/wEPDwUKMTg0NTgwMzM2M2RksjXHwIOzdq/skwDy1k6qTexm2j0="
id="__EVENTVALIDATION" valor="/wEWBAKxhbOEAQKPpuq2CALyveCRDwLejM6fDwP2723lUdzBJVBIAVzbpM2sXYqc"
Os valores de "__VIEWSTATE" e "__EVENTVALIDATION" obtidos através de "View Source File" não podem ser enviados diretamente ao formulário e precisam ser convertidos em strings codificadas em URL.
viewState = System.Web.HttpUtility.UrlEncode(viewState);
eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation);
O código completo é o seguinte:
// Texto do botão enviar
string submitButton = "Login";
//VeiwState da página (pode ser obtido abrindo a página através do IE, clicando com o botão direito em "Ver arquivo fonte")
string viewState = "/wEPDwUKMTg0NTgwMzM2M2RksjXHwIOzdq/skwDy1k6qTexm2j0=";
//EventValidation da página (pode ser obtido abrindo a página através do IE, clicando com o botão direito em "Ver arquivo fonte")
string eventValidation = "/wEWBAKxhbOEAQKPpuq2CALyveCRDwLejM6fDwP2723lUdzBJVBIAVzbpM2sXYqc"
;
viewState = System.Web.HttpUtility.UrlEncode(viewState);
(
eventValidation);
{
//String URI para enviar o formulário.
string uriString = " http://www.xxx.com/Login.aspx ";
// String de dados a serem enviados. O formato é o seguinte: user=uesr1&password=123
string postString = "userName=1&password=1" + "&loginButton=" + submitButton + "&__VIEWSTATE=" + viewState + "&__EVENTVALIDATION=" + eventValidation;
//Inicializa WebClient
WebClient webClient = new WebClient();
webClient.Headers.Add("Tipo de conteúdo", "aplicativo/x-www-form-urlencoded");
//Converte string em array de bytes
byte[] postData = Encoding.ASCII.GetBytes(postString);
//Carrega os dados e retorna o array de bytes da página
byte[] responseData = webClient.UploadData(uriString, "POST", postData);
// Converte o array de bytes retornado em uma string (HTML);
//A página retornada pelo ASP.NET geralmente é Unicode. Se for chinês simplificado, deverá ser usada.
//Encoding.GetEncoding("GB2312").GetString(responseData)
string srcString = Encoding.UTF8.GetString(responseData);
}
pegar (WebException nós)
{
string mensagem = we.Message;
}
Algumas notas:
1) srcStrinig é o HTML da página retornada após o envio do formulário. Você pode usar expressões regulares para analisá-lo e obter os dados necessários.
2) Os valores de "__VIEWSTATE" e "__EVENTVALIDATION" não são estáticos.
3) Você também pode visualizar dados POST de páginas da web por meio de algumas ferramentas, como: ferramenta de análise de dados de páginas da web HttpWatch, sniffer de rede, etc.
4) Caso o formulário enviado possua código de verificação, o mesmo não se enquadra no escopo deste artigo.
URL deste artigo: http://www.cnblogs.com/anjou/archive/2006/12/25/602943.html