【问题标题】:Webrequest via post method return 404 Not Found通过 post 方法的 Web 请求返回 404 Not Found
【发布时间】:2016-01-01 12:55:30
【问题描述】:

就像标题所说的那样,我试图通过发布到某个页面的方式提出请求。首先使用谷歌开发工具检查请求的参数,我可以弄清楚这一点(我不确定我是否将所有正确的参数都放在我的帖子字符串中 - 检查图像以获取更多信息)。我在 www 周围找到了很多示例,但没有人使用它,我不知道出了什么问题,我会像往常一样提供一些帮助:)。

请求标头

表单数据

这是我的代码:

string email = "xxxxx";
string password = "xxxxx";

string LOGIN_URL = "https://intranet.cibertec.edu.pe/LoginBolsa/LoginBolsaCIB.aspx";

CookieContainer cookies = new CookieContainer();

HttpWebRequest webRequest = WebRequest.Create(LOGIN_URL) as HttpWebRequest;
webRequest.CookieContainer = cookies;
StreamReader responseReader = new StreamReader(
      webRequest.GetResponse().GetResponseStream()
   );
string responseData = responseReader.ReadToEnd();
responseReader.Close();

string postString = string.Format("ctl00$ContentPlaceHolder1$Login1$UserName={0}&ctl00$ContentPlaceHolder1$Login1$Password={1}&ctl00$ContentPlaceHolder1$Login1$LoginButton={2}&hdnOrigen={3}&hdnLinea={4}&Pagina_Principal={5}", email, password, "Ingresar", "bolsa", "I", "LoginBolsaCIB.aspx");


webRequest = WebRequest.Create(LOGIN_URL) as HttpWebRequest;
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.CookieContainer = cookies;


StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream());
requestWriter.Write(postString);
requestWriter.Close();

responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
responseData = responseReader.ReadToEnd();
responseReader.Close();

Response.Write(responseData);

【问题讨论】:

  • 可能您从 Google 开发者工具发出的请求使用 SAME-ORIGIN 调用,但是当您执行代码时,存在不同的来源导致 SAME-ORIGIN 政策出现问题?
  • 有一种方法可以设置原始策略或一些解决方法吗?
  • 只有在您可以控制服务器端的情况下才能设置源策略。您能否说明您是否能够使用 Google 开发者工具成功发布 POST?
  • 你的意思是,如果同源政策是真的或类似的东西,我无法通过其他网页发出请求?。
  • @DavidTansey ,我不知道如何使用开发人员工具提出请求,所以我关注了这个stackoverflow.com/questions/14248296/…,但是发生了错误“Uncaught SyntaxError: Unexpected string(...)”

标签: c# asp.net post webrequest


【解决方案1】:

这是因为缺少 __ViewState 参数。这个参数是隐藏的表单字段,需要为每个请求附加。

int start = responseData.IndexOf("value=\"", responseData.IndexOf("name=\"__VIEWSTATE\""));
int end = responseData.IndexOf("/>", start);
string viewState = responseData.Substring(start + 7, end - start - 9);
string postString = string.Format("ctl00$ContentPlaceHolder1$Login1$UserName={0}&ctl00$ContentPlaceHolder1$Login1$Password={1}&ctl00$ContentPlaceHolder1$Login1$LoginButton={2}&hdnOrigen={3}&hdnLinea={4}&Pagina_Principal={5}", email, password, "Ingresar", "bolsa", "I", "LoginBolsaCIB.aspx");
postString += String.Concat("&__VIEWSTATE=", viewState);

【讨论】:

  • 谢谢兄弟,就像你介绍的一样,奇怪的是我想当放置cookies容器也发送视图状态时,为什么这不会发生?。
  • 没有办法以更“优雅”的形式获得视图状态?
  • @JuanRuizdeCastilla,通过使用像HtmlAgilityPack 这样的第 3 方,但我想保持简单而不会使您的代码复杂化。此外,我们可以使用类似Generic Tag Extractor 的函数进行当前提取。 __ViewState 是输入类型,属于应作为Http Content 的一部分发送的数据,而CookiesHttp Headers 的一部分
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2021-02-07
  • 2020-03-16
  • 2023-02-24
相关资源
最近更新 更多