[英]How to use HttpRequestMessage truely and avoid Error 500 in HttpClient PostAsync?
它应该用字符串值填充“textbox1”并在 textbox3 中获取另一个字符串。 对于这项工作,我检查了网站中的 ASP 表单元素,并在填写表单并提交时在“网络”部分检查了“POST”活动。因此,我编写了这段代码来发送 post 请求并获得响应。 但我得到的错误告诉我“确保请求标头与“HttpRequestMessage”和“HttpResponseMessage”一起使用。在我添加标头部分之前,我在控制台中收到错误 500。请告诉我正确的编码。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
namespace WebRequest
{
class myRequest3
{
public async static void submitpost()
{
using (var client = new HttpClient())
{
var values = new Dictionary<string, string>
{
{"ctl00$ScriptManager1","ctl00$content$ctl00|ctl00$content$Button4" },
{"__EVENTTARGET","" },
{"__EVENTARGUMENT","" },
{"__VIEWSTATE", "/wEPDwUKLTM1MTY1NjE1Nw9kFgJmD2QWAgIJD2QWAgIDD2QWAgIDD2QWAgIBD2QWAmYPZBYCAgEPDxYCHgZfVGl0bGUFGtiz2LHbjNin2YQg2YHYudin2YQg2LPYp9iyZGRkP5ZIUYR1R/p/JMF4Ez0q2psS7pQ= " },
{"__VIEWSTATEGENERATOR", "CA0B0334" },
{"__EVENTVALIDATION", "/wEWBAL6k4rsBQLt4KPyCgL84ejwCALt4KvyCh3brVZZShAeom3oNb8A0uWDpqDK" },
{"ctl00$content$TextBox1", "hfc0Ac0TIaFPrpef5IGZJQTrCrBdm4S+" },
{"ctl00$content$TextBox3", "" },
{"__ASYNCPOST", "true" },
{"ctl00$content$Button4", "ساخت سریال فعال ساز" },
};
var content = new FormUrlEncodedContent(values);
client.DefaultRequestHeaders.Add("Accept","*/*");
client.DefaultRequestHeaders.Add("Accept-Encoding","gzip, deflate");
client.DefaultRequestHeaders.Add("Accept-Language", "en-US,en;q=0.5");
client.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
client.DefaultRequestHeaders.Add("Connection","keep-alive");
client.DefaultRequestHeaders.Add("Content-Length", "641");
client.DefaultRequestHeaders.Add("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
client.DefaultRequestHeaders.Add("Host","address");
client.DefaultRequestHeaders.Add("Origin","http://address");
client.DefaultRequestHeaders.Add("Referer","http://address/");
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0");
client.DefaultRequestHeaders.Add("X-MicrosoftAjax","Delta=true");
var response = await client.PostAsync("http://address/default.aspx", content);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
}
}
}
}
您需要注意几件事: 默认请求标头 - 其中一些是在内容或 httpclient class 中预定义的,因此您永远不应该这样做,例如破坏代码的行
client.DefaultRequestHeaders.Add("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
总会给你错误,因为这是在你生成内容时完成的。 所以你可以这样检查:
var content = new FormUrlEncodedContent(values);
var checkContentType = content.Headers.ContentType;// == "application/x-www-form-urlencoded;
因此,如果我们只使用必要的代码对您的标头代码进行一些编辑,那就是我们得到的:
client.DefaultRequestHeaders.Add("Accept", "*/*"); //ok
// client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate"); // unnecessary
// client.DefaultRequestHeaders.Add("Accept-Language", "en-US,en;q=0.5"); // unnecessary
// client.DefaultRequestHeaders.Add("Cache-Control", "no-cache"); // unnecessary
// client.DefaultRequestHeaders.Add("Connection", "keep-alive");
// client.DefaultRequestHeaders.Add("Content-Length", "641"); // creating content handles that - unnecessary
// client.DefaultRequestHeaders.Add("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); // already set when creating content
// client.DefaultRequestHeaders.Add("Host", "address"); // unnecessary
// client.DefaultRequestHeaders.Add("Origin", "http://address"); // unnecessary
// client.DefaultRequestHeaders.Add("Referer", "http://address/"); //unnecessary
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0");
// client.DefaultRequestHeaders.Add("X-MicrosoftAjax", "Delta=true"); // unnecessary
现在运行代码后,响应为 200(正常),但服务器返回“0|error|500||” 因此您需要检查服务器端参数/表单数据是否需要或缺失。
错误 500 已通过修改字典值解决。 我错误地输入了“__VIEWSTATE”值,除了第一个错误外,有些值是不必要的。 通过解析 responseString 我可以达到 textbox3 值。 这是正确的代码:
var client = new HttpClient();
var values = new Dictionary<string, string>{
{"__VIEWSTATE", "/wEPDwUKLTM1MTY1NjE1Nw9kFgJmD2QWAgIJD2QWAgIDD2QWAgIDD2QWAgIBD2QWAmYPZBYCAgEPDxYCHgZfVGl0bGUFGtiz2LHbjNin2YQg2YHYudin2YQg2LPYp9iyZGRkP5ZIUYR1R/p/JMF4Ez0q2psS7pQ=" },
{"__EVENTVALIDATION", "/wEWBAL6k4rsBQLt4KPyCgL84ejwCALt4KvyCh3brVZZShAeom3oNb8A0uWDpqDK" },
{"ctl00$content$TextBox1", "hfd0Ac0TIaFPrpef5IGZJQTrCrBdm4S+" },
{"ctl00$content$Button4", "ساخت سریال فعال ساز" },
};
var content = new FormUrlEncodedContent(values);
client.DefaultRequestHeaders.Add("Accept", "*/*");
HttpResponseMessage response = await client.PostAsync("http://address/default.aspx", content);
Thread.Sleep(50);
string responseString = await response.Content.ReadAsStringAsync();
Thread.Sleep(50);
string textbox3Value= HTMLValue(responseString, "ctl00_content_TextBox3");
Console.WriteLine("finished");
这是我为提取 textBox3 值而编写的自定义代码:
public static string HTMLValue(string responseResult, string xElement)
{
int x = 0;
int y = 0;
string value = "";
x = responseResult.IndexOf(xElement);
responseResult = responseResult.Substring(x + 1);
x = responseResult.IndexOf(">");
y = responseResult.IndexOf("<");
if(y-x-1>0)value = responseResult.Substring(x + 1, y - x - 1);
return (value);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.