Заполнение веб-формы в C#

Я пытаюсь заполнить веб-форму автоматически с C#. Вот мой код, который я взял из старого сообщения о переполнении стека:

//NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag
string formUrl = "https://url/Login/Login.aspx?ReturnUrl=/Student/Grades.aspx"; 
string formParams = string.Format(@"{0}={1}&{2}={3}&{4}=%D7%9B%D7%A0%D7%99%D7%A1%D7%94", usernameBoxID ,"*myusernamehere*",passwordBoxID,"*mypasswordhere*" ,buttonID);
string cookieHeader;
WebRequest req = WebRequest.Create(formUrl); //creating the request with the form url.
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST"; // http POST mode.
byte[] bytes = Encoding.ASCII.GetBytes(formParams); // convert the data to bytes for the sending.
req.ContentLength = bytes.Length; // set the length
using (Stream os = req.GetRequestStream())
{
   os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = req.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
   string pageSource = sr.ReadToEnd();
}

Имя пользователя и пароль верны. Я посмотрел на источник веб-сайта, и он имеет 3 значения для ввода (имя пользователя, пароль, проверка кнопки). Но как-то resp и pageSource это возвращение всегда снова страница входа.

Я понятия не имею, что это происходит, какие-нибудь идеи?

1 ответ

Решение

Вы пытаетесь сделать это очень сложно, попробуйте использовать.Net HttpClient:

using System;
using System.Collections.Generic;
using System.Net.Http;

class Program
{
    static void Main()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:6740");
            var content = new FormUrlEncodedContent(new[] 
            {
                new KeyValuePair<string, string>("***", "login"),
                new KeyValuePair<string, string>("param1", "some value"),
                new KeyValuePair<string, string>("param2", "some other value")
            });

     var result = client.PostAsync("/api/Membership/exists", content).Result;

     if (result.IsSuccessStatusCode)
        {
            Console.WriteLine(result.StatusCode.ToString());
            string resultContent = result.Content.ReadAsStringAsync().Result;
             Console.WriteLine(resultContent);
        }
        else
        {
            // problems handling here
            Console.WriteLine( "Error occurred, the status code is: {0}",   result.StatusCode);
        }      
        }
    }
}

Проверьте этот ответ, может помочь: .NET HttpClient. Как выставить строковое значение?

Другие вопросы по тегам