通过post方法返回的Webrequest 404没有找到

问题描述:

像tittle说的,我试图通过发布到某个页面发出请求。首先使用谷歌开发人员工具,检查参数的请求,我可以弄清楚这一点(我不完全确定是否将所有正确的参数放在我的后字符串中 - 查看图像以获取更多信息)。我在www的网站上发现了很多例子,但是没有人能够使用这个例子,我不知道什么是错误的,我总是会有点帮助:)。通过post方法返回的Webrequest 404没有找到

请求头

header_post

表单数据

form_data

这是我的代码:

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); 
+0

可能来自Google Developer Tools的请求被SAME-ORIGIN调用,但是当您执行代码时,会出现另一个源,导致SAME-ORIGIN策略出现问题? –

+0

有一种方法可以设置原产地策略或某种解决方法? –

+0

如果您可以控制服务器端,则只能设置原始策略。您能否澄清您是否能够使用Google Developer Tools成功发布POST? –

这是因为缺少__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); 
+0

谢谢兄弟,就像你介绍它的作品一样,好奇地我以为,当把cookie容器也发送viewstate的时候,为什么这不会发生? –

+0

Theres没有办法以更优雅的形式获得视图状态? –

+0

@JuanRuizdeCastilla,通过使用第三方如'HtmlAgilityPack',但我想保持简单而不会使代码复杂化。另外,我们可以使用'Generic Tag Extractor'功能来进行当前提取。 '__ViewState'是一个输入类型,属于应该作为Http Content的一部分发送的数据,而Cookie是Http Headers的一部分。 –