Как сделать запрос на публикацию, сначала добавив viewstate, используя веб-запрос Http - PullRequest
0 голосов
/ 09 апреля 2019

Я хочу сделать запрос для того, чтобы почтовый запрос работал, мне нужно передать viewstate, генератор viewstate и проверку события вместе с другими входными данными.

проблема заключается в том, что эти параметры представления состояния, генератора представления состояния и проверки события меняются при каждой загрузке страницы

так что мне нужно обработать все за один выстрел.

public static async Task<HtmlDocument> PostRequestTest(string cookie, string url)
    {


        var sb = new StringBuilder();
        AppendParameter(sb, "Textbox1", "cc");
        AppendParameter(sb, "Textbox2", "sa");
        AppendParameter(sb, "Textbox3", "Baslatan");
        AppendParameter(sb, "Button1", "Login");




        //Get html body from url and store it to htmlToParse
        string htmlToParse;

        var webRequest = WebRequest.Create(url) as HttpWebRequest;
        using (var responseReader = new StreamReader( (await webRequest?.GetResponseAsync()).GetResponseStream()))
        {
             htmlToParse = await responseReader.ReadToEndAsync();

        }

        //load Html With agility Pack
        var originalUrlDoc = new HtmlDocument();
        originalUrlDoc.LoadHtml(htmlToParse);

        //Get values and append to list
        var viewState = originalUrlDoc.DocumentNode.SelectSingleNode("//input[@type='hidden' and @name='__VIEWSTATE']").Attributes["value"].Value;
        var viewStateGenerator = originalUrlDoc.DocumentNode.SelectSingleNode("//input[@type='hidden' and @name='__VIEWSTATEGENERATOR']").Attributes["value"].Value;
        var eventValidation = originalUrlDoc.DocumentNode.SelectSingleNode("//input[@type='hidden' and @name='__EVENTVALIDATION']").Attributes["value"].Value;
        AppendParameter(sb, "__VIEWSTATE", viewState);
        AppendParameter(sb, "__VIEWSTATEGENERATOR", viewStateGenerator);
        AppendParameter(sb, "__EVENTVALIDATION", eventValidation);


        var databytes = Encoding.UTF8.GetBytes(sb.ToString());


        webRequest.Method = "POST";
        webRequest.ContentType = "application/x-www-form-urlencoded; charset=utf-8";



        webRequest.CookieContainer = new CookieContainer();
        webRequest.CookieContainer.SetCookies(new Uri(url), cookie);

        //request.AllowAutoRedirect = false;
        //request.UseDefaultCredentials = false;
        //request.ContentLength = databytes.Length;

        //Here I get an exception saying System.Net.ProtocolViolationException: 'Cannot send a content-body with this verb-type.'

        using (var stream = webRequest.GetRequestStream())
        {
            stream.Write(databytes, 0, databytes.Length);
        }



        using (var response = (HttpWebResponse)(await webRequest.GetResponseAsync()))
        {
            var responseString = new StreamReader( response.GetResponseStream()).ReadToEndAsync();

            var htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(await responseString);

            return htmlDoc;
        }


    }
    protected static void AppendParameter(StringBuilder sb, string name, string value)
    {
        string encodedValue = HttpUtility.UrlEncode(value);
        sb.AppendFormat("{0}={1}&", name, encodedValue);
    }

поэтому, когда код набирает

// Здесь я получаю исключение, говорящее System.Net.ProtocolViolationException: «Невозможно отправить тело содержимого с этим типом глагола.»

    using (var stream = webRequest.GetRequestStream())
    {
        stream.Write(databytes, 0, databytes.Length);
    }
...