通过post方法返回的Webrequest 404没有找到
像tittle说的,我试图通过发布到某个页面发出请求。首先使用谷歌开发人员工具,检查参数的请求,我可以弄清楚这一点(我不完全确定是否将所有正确的参数放在我的后字符串中 - 查看图像以获取更多信息)。我在www的网站上发现了很多例子,但是没有人能够使用这个例子,我不知道什么是错误的,我总是会有点帮助:)。通过post方法返回的Webrequest 404没有找到
请求头
表单数据
这是我的代码:
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);
这是因为缺少__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);
谢谢兄弟,就像你介绍它的作品一样,好奇地我以为,当把cookie容器也发送viewstate的时候,为什么这不会发生? –
Theres没有办法以更优雅的形式获得视图状态? –
@JuanRuizdeCastilla,通过使用第三方如'HtmlAgilityPack',但我想保持简单而不会使代码复杂化。另外,我们可以使用'Generic Tag Extractor'功能来进行当前提取。 '__ViewState'是一个输入类型,属于应该作为Http Content的一部分发送的数据,而Cookie是Http Headers的一部分。 –
可能来自Google Developer Tools的请求被SAME-ORIGIN调用,但是当您执行代码时,会出现另一个源,导致SAME-ORIGIN策略出现问题? –
有一种方法可以设置原产地策略或某种解决方法? –
如果您可以控制服务器端,则只能设置原始策略。您能否澄清您是否能够使用Google Developer Tools成功发布POST? –