Pergunta

Este pedaço de código não funciona; ele está entrando no site, que é https usando o protocolo. Como resolver este problema? O código pára no GetRequestStream() a qualquer hora em qualquer lugar dizendo que exceção violação de protocolo não for tratada ..

string username = "user";
string password = "pass";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://moje.azet.sk/prihlasenie.phtml?KDE=www.azet.sk%2Findex.phtml%3F");
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)";

Console.WriteLine(request.GetRequestStream());

using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
{
    writer.Write("nick=" + username + "&password=" + password);
}

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//Retrieve your cookie that id's your session
//response.Cookies

using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    Console.WriteLine(reader.ReadToEnd());
}
Foi útil?

Solução

Set método de solicitação de post, antes de chamar GetRequestStream

como

request.Method = "POST";

using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
{
    writer.Write("nick=" + username + "&password=" + password);
}

Outras dicas

Meu palpite é que o problema que você está enfrentando é devido ao fato de (como outros têm aconselhado) que você está fazendo uma solicitação GET em vez de um pedido POST. Além disso, notei que o nome real para o campo de senha nessa página é "Heslo" e não "password". Este erro de digitação não fará com que o servidor web para não retornar uma resposta, mas vai causar outros problemas, uma vez que o servidor está procurando o nome da variável específica para ser postado com o valor da senha.

Você também pode querer descobrir o comprimento total do que você está postando, de antemão, e defina-o como o ContentLength do pedido. Consulte MSDN :

A ProtocolViolationException é jogado em vários casos, quando as propriedades definidas no HttpWebRequest classe são conflitantes. Essa exceção ocorre se um aplicativo define o ContentLength propriedade ea propriedade SendChunked a verdade, e, em seguida, envia uma solicitação HTTP GET solicitação. Essa exceção ocorre se um aplicativo tenta enviar fragmentada a um servidor que suporta apenas protocolo HTTP 1.0, quando tal não é suportado. Esta exceção ocorre se um tentativas de aplicação para enviar dados sem definir a propriedade ContentLength ou a SendChunked é falsa quando o buffer está desativado e em uma conexão keepalive (o KeepAlive propriedade é true).

Aqui está o que funciona para mim:

    var request = WebRequest.Create(_url);
    request.PreAuthenticate = true;
    request.Credentials = new NetworkCredential(_userName, _password);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top