• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

欲哭无泪的WebRequest.Create模拟登录session问题

artak 2014-02-26 04:08:58
代码如下,能够登陆login.aspx成功并且获取url2(该页面是有会话的) 的内容,但是
如果我点击url2页面里面的新闻链接,转到它的详细内容页面,就提示未登录了,为什么状态没保存,怎么保存呢?感觉就是登录成功后获取网页内容显示后,会话就消失

Dictionary<string, string> postParams = new Dictionary<string, string>();
postParams.Add("username", userno);
postParams.Add("Password", baseMethod.GetPassword(userno, 2));
postParams.Add("Button1", "Sign in");
string url1 = "http://xxx/login.aspx?Login";
string url2 = "http://xxx/newslist.aspx";
string result = baseMethod.GetAspNetCodeResponseDataFromWebSite(postParams, url1, url2);
System.Web.HttpContext.Current.Response.Write(result);

调用下面的方法
public static string GetAspNetCodeResponseDataFromWebSite(Dictionary<string, string> postParams, string getViewStateAndEventValidationLoginUrl, string getDataUrl)
{
if (postParams == null || postParams.Keys.Count != 3)
{
string errorMessage = "参数中需要包含如下3个信息,缺一不可。用户名(用户名文本框的ID和内容)、密码(密码文本框的ID和内容)、summit按钮(button按钮的ID和Text)";
return errorMessage;
}
try
{
CookieContainer cookieContainer = new CookieContainer();

// 设置打开页面的参数
HttpWebRequest request = WebRequest.Create(getViewStateAndEventValidationLoginUrl) as HttpWebRequest;
//request.Method = "get";
//request.KeepAlive = false;
//cookieContainer = request.CookieContainer;

// 接收返回的页面
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
System.IO.Stream responseStream = response.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
string srcString = reader.ReadToEnd();

// 要提交的字符串数据。格式形如:user=uesr1&password=123
string postString = "";
foreach (KeyValuePair<string, string> de in postParams)
{
//把提交按钮中的中文字符转换成url格式,以防中文或空格等信息
postString += System.Web.HttpUtility.UrlEncode(de.Key.ToString()) + "=" + System.Web.HttpUtility.UrlEncode(de.Value.ToString()) + "&";
}
// 将提交的字符串数据转换成字节数组
byte[] postData = Encoding.ASCII.GetBytes(postString);

// 设置提交的相关参数
request = WebRequest.Create(getViewStateAndEventValidationLoginUrl) as HttpWebRequest;
request.Method = "POST";
request.KeepAlive = false;
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = cookieContainer;
request.ContentLength = postData.Length;

// 提交请求数据
System.IO.Stream outputStream = request.GetRequestStream();
outputStream.Write(postData, 0, postData.Length);
outputStream.Close();

// 接收返回的页面
response = request.GetResponse() as HttpWebResponse;
responseStream = response.GetResponseStream();
reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("GB2312"));
srcString = reader.ReadToEnd();

///////////////////////////////////////////////////
// 3.打开需要抓取数据的页面
///////////////////////////////////////////////////
// 设置打开页面的参数
request = WebRequest.Create(getDataUrl) as HttpWebRequest;
request.Method = "get";
request.KeepAlive = false;
request.CookieContainer = cookieContainer;


// 接收返回的页面
response = request.GetResponse() as HttpWebResponse;
responseStream = response.GetResponseStream();
reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
srcString = reader.ReadToEnd();
return srcString;
///////////////////////////////////////////////////
// 4.分析返回的页面
///////////////////////////////////////////////////
}
catch (WebException we)
{
string msg = we.Message;
return msg;
}
}
...全文
243 点赞 收藏 11
写回复
11 条回复
feiyun0112 2014年02月26日
System.Web.HttpContext.Current.Response.Cookies.Add(cookie)
回复 点赞
artak 2014年02月26日
引用 9 楼 feiyun0112 的回复:
在GetAspNetCodeResponseDataFromWebSite最后写 foreach( var cookie in response.Cookies) { System.Web.HttpContext.Current.Response.addCookie(cookie); }
好像c#没有addCookie
回复 点赞
feiyun0112 2014年02月26日
在GetAspNetCodeResponseDataFromWebSite最后写
foreach( var cookie in response.Cookies)
{

System.Web.HttpContext.Current.Response.addCookie(cookie);
}
回复 点赞
artak 2014年02月26日
引用 6 楼 feiyun0112 的回复:
那你要把登录后得到的cookie写到 System.Web.HttpContext.Current
嗯,现在就是我用GetAspNetCodeResponseDataFromWebSite登录成功后能写cookie吗,不懂如何写
回复 点赞
feiyun0112 2014年02月26日
那你要把登录后得到的cookie写到 System.Web.HttpContext.Current
回复 点赞
artak 2014年02月26日
引用 4 楼 feiyun0112 的回复:
你不是一个域,不可能跨域访问别的网站的cookie
其实我都是在同一个域名下面的,就是不同的二级域名,不懂算不算 假如不能跨域,首先我通过GetAspNetCodeResponseDataFromWebSite登陆成功后,获取了b网页的源文件,内容如下,改源文件后很多的form的内容,通过下面的方法提交,我想直接用它上面的提交按钮完成提交,能实现吗?我现在就是因为没有session实现不了。 获取的代码简要如下 <form onsubmit="if (document.all.spanRetractReviewer != null) document.all.spanRetractReviewer.innerHTML = ""; document._domino_target = "_top";" method="post" action="http://xxx/bbb.aspx?OpenForm&ParentUNID=8139367E4CCDBBBD48257C8B001676D7&Seq=1" name="_FM_Review">
回复 点赞
feiyun0112 2014年02月26日
你不是一个域,不可能跨域访问别的网站的cookie
回复 点赞
artak 2014年02月26日
引用 1 楼 feiyun0112 的回复:
点击url2页面里面的新闻链接,同样也要用GetAspNetCodeResponseDataFromWebSite得到数据 ***************************************************************************** 签名档: http://feiyun0112.cnblogs.com/
其实我这样做的原因是当我post登陆login.aspx后,就转到了被psot网站的一个表单页面,通过获取表单的html代码,然后在b网站显示该表单,这个时候,在b网站点击该表单的提交按钮提交,可是这个提交的时候没登陆了
回复 点赞
artak 2014年02月26日
引用 1 楼 feiyun0112 的回复:
点击url2页面里面的新闻链接,同样也要用GetAspNetCodeResponseDataFromWebSite得到数据 ***************************************************************************** 签名档: http://feiyun0112.cnblogs.com/
确实是这样的,我现在就是这样做,点击url2页面里面的新闻链接先用GetAspNetCodeResponseDataFromWebSite的到数据,但是我现在不是想要这样,希望是post后整个浏览器就有session了,不用在GetAspNetCodeResponseDataFromWebSite,能实现吗
回复 点赞
feiyun0112 2014年02月26日
点击url2页面里面的新闻链接,同样也要用GetAspNetCodeResponseDataFromWebSite得到数据


*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告