Я хочу сделать запрос
для того, чтобы почтовый запрос работал, мне нужно передать 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);
}