■■■■HttpWebRequest的问题 Session丢失。。在线等 急急急!!!

zhu18 2008-11-20 12:41:55


//1.aspx
protected void Page_Load(object sender, EventArgs e)
{
//给会话添加一项
Session.Add("ss", "ttttt");
//请求2.aspx得到HTML
string s = HttpWebResponsePost("http://localhost:1155/Web/2.aspx", "", "utf-8");
Response.Write(s);
}

public static string HttpWebResponsePost(string url, string postData, string encodeType)
{

Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.GetEncoding(encodeType);
byte[] data = encoding.GetBytes(postData);

try
{
request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = true;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Close();
response = request.GetResponse() as HttpWebResponse;
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
string content = sr.ReadToEnd();
return content;
}
catch (Exception ex)
{
return string.Empty;
}
}



//被请求的2.aspx
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("request page... Session Count:"+Session.Count);
}


结果:"request page... Session Count:0"

说明这他们不在一个会话中 有什么办法让他们在一个会话中 共享Session
...全文
384 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq254242213 2010-04-09
  • 打赏
  • 举报
回复
acczcczxcxccxccc
yagebu1983 2008-11-20
  • 打赏
  • 举报
回复
试试别的页面缓存!!
zhu18 2008-11-20
  • 打赏
  • 举报
回复
虽然我很傻,我一定要看懂,
TO:brood108
你能告诉我你QQ吗 或你的QQ群,谢谢你了

来这里也把分接了
http://topic.csdn.net/u/20081120/09/176f246b-8089-426c-8020-5580c8012456.html?seed=2004610552
gang027 2008-11-20
  • 打赏
  • 举报
回复
up
brood108 2008-11-20
  • 打赏
  • 举报
回复
这里的cookie 其实存的就是session

请求第一个页面的时候 得到cookie 请求第2个页面的时候,需要赋上cookie
这其实是模拟http协议的同一个线程先后请求页面

不管几个页面,你请求第2个页面的时候 cookie如果是空,就等于session是空
你需要请求第2个页面的时候 给cookie赋值的
zhu18 2008-11-20
  • 打赏
  • 举报
回复
说真话 我没有理解你的代码;我改了下就想2个页面简单点,不知道为什么不行。能不能具体帮我解释下,
我真心谢谢你。


//1.aspx [把3.aspx的代码放到1来了]
protected void Page_Load(object sender, EventArgs e)
{
//给会话添加一项
Session.Add("ss", "ttttt");
string cookie = "";
string outcookie = "";
string s2 = HttpWebResponsePost("http://localhost:4455/DDD/2.aspx", "", "utf-8", cookie, out outcookie);
Response.Write(s2);
}

public static string HttpWebResponsePost(string url, string postData, string encodeType, string cookie, out string outcookie)
{

Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.GetEncoding(encodeType);
byte[] data = encoding.GetBytes(postData);

try
{
request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
if (cookie != "")
{
request.CookieContainer.SetCookies(new Uri(url), cookie);
}
request.AllowAutoRedirect = true;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Close();
response = request.GetResponse() as HttpWebResponse;
instream = response.GetResponseStream();

outcookie = request.CookieContainer.GetCookieHeader(new Uri(url));

sr = new StreamReader(instream, encoding);
string content = sr.ReadToEnd();
return content;
}
catch (Exception ex)
{
outcookie = "";
return string.Empty;
}
}
//2.aspx代码不变
brood108 2008-11-20
  • 打赏
  • 举报
回复
原理是这样的
instream = response.GetResponseStream();
这一步请求之后,页面才被真正的请求 这个时候才被赋session
所以outcookie应该在这一步获取才能取到值

我之前获取的时候,获取的位置错了,页面还没有被请求,当然得到的是空啦
zhu18 2008-11-20
  • 打赏
  • 举报
回复
日 你真强
看到效果了 我先体会下你代码
请稍等下 。。。
zhu18 2008-11-20
  • 打赏
  • 举报
回复
To:brood108
cookie2 不是空 是cookie = "ddd";最开始设置的值。

我最终想实现
1.aspx页面中Session添加一项,然后去请求2.aspx
想在被请求的2.aspx中得到1.aspx添加的Session的值, 要求使用Session对象。

这样可以吗...
brood108 2008-11-20
  • 打赏
  • 举报
回复
哈哈 不好意思啊 outcookie的位置写错了
感觉不会有问题 所以没有调试
现在调试了一下 果然发现写错了
这次调试了一下 没问题了! 正确的应该是这样


public static string HttpWebResponsePost(string url, string postData, string encodeType, string cookie, out string outcookie)
{

Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.GetEncoding(encodeType);
byte[] data = encoding.GetBytes(postData);

try
{
request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
if (cookie != "")
{
request.CookieContainer.SetCookies(new Uri(url), cookie);
}
request.AllowAutoRedirect = true;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Close();
response = request.GetResponse() as HttpWebResponse;
instream = response.GetResponseStream();

outcookie = request.CookieContainer.GetCookieHeader(new Uri(url));

sr = new StreamReader(instream, encoding);
string content = sr.ReadToEnd();
return content;
}
catch (Exception ex)
{
outcookie = "";
return string.Empty;
}
}
brood108 2008-11-20
  • 打赏
  • 举报
回复
string cookie2=outcookie;

这个得到的的cookie2 是空的吗?
zhu18 2008-11-20
  • 打赏
  • 举报
回复
TO:brood108
我的3个页面是这样的 有什么问题吗 Session还是0

//1.aspx
protected void Page_Load(object sender, EventArgs e)
{
//给会话添加一项
Session.Add("ss", "ttttt");
}
//2.aspx
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("request page... Session Count:"+Session.Count);
if (Session["ss"]!=null)
Response.Write("<br>Session[\"ss\"]="+Session["ss"].ToString());
}
//3.aspx
protected void Page_Load(object sender, EventArgs e)
{
//请求3.aspx得到HTML
string cookie = "";
string outcookie = "";
string s1 = HttpWebResponsePost("http://localhost:4455/DDD/1.aspx", "", "utf-8", cookie, out outcookie);
string cookie2 = outcookie;
string s2 = HttpWebResponsePost("http://localhost:4455/DDD/2.aspx", "", "utf-8", cookie2, out cookie);
Response.Write(s2);
}

public static string HttpWebResponsePost(string url, string postData, string encodeType, string cookie, out string outcookie)
{

Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.GetEncoding(encodeType);
byte[] data = encoding.GetBytes(postData);

try
{
request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
if(cookie != "")
{
request.CookieContainer.SetCookies(new Uri(url), cookie);
}
request.AllowAutoRedirect = true;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();

outcookie = request.CookieContainer.GetCookieHeader(new Uri(url));

outstream.Write(data, 0, data.Length);
outstream.Close();
response = request.GetResponse() as HttpWebResponse;
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
string content = sr.ReadToEnd();
return content;
}
catch (Exception ex)
{
outcookie = "";
return string.Empty;
}
}
zhu18 2008-11-20
  • 打赏
  • 举报
回复
好像还不行 Session.Count=0
brood108 2008-11-20
  • 打赏
  • 举报
回复
上边那个有点问题 这次应该就对了
你直接请求3.aspx 查看效果

//1.aspx
protected void Page_Load(object sender, EventArgs e)
{
//给会话添加一项
Session.Add("ss", "ttttt");
}
//2.aspx
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("request page... Session Count:"+Session.Count);
Response.Write("<br>Session[\"ss\"]="+session["ss"].ToString();
}

//3.aspx
protected void Page_Load(object sender, EventArgs e)
{
//请求3.aspx得到HTML
string cookie="";
string outcookie="";
string s1 = HttpWebResponsePost("http://localhost:1155/Web/1.aspx", "", "utf-8",cookie,out outcookie);
string cookie2=outcookie;
string s2 = HttpWebResponsePost("http://localhost:1155/Web/2.aspx", "", "utf-8",cookie2,outcookie);
Response.Write(s2);
}

public static string HttpWebResponsePost(string url, string postData, string encodeType ,string cookie, out string outcookie)
{

Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.GetEncoding(encodeType);
byte[] data = encoding.GetBytes(postData);

try
{
request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
if(cookie != "")
{
request.CookieContainer.SetCookies(new Uri(url), cookie)
}
request.AllowAutoRedirect = true;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();

outcookie = request.CookieContainer.GetCookieHeader(new Uri(url))

outstream.Write(data, 0, data.Length);
outstream.Close();
response = request.GetResponse() as HttpWebResponse;
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
string content = sr.ReadToEnd();
return content;
}
catch (Exception ex)
{
return string.Empty;
}
}


brood108 2008-11-20
  • 打赏
  • 举报
回复



//1.aspx
protected void Page_Load(object sender, EventArgs e)
{
//给会话添加一项
Session.Add("ss", "ttttt");
//请求2.aspx得到HTML
string s = HttpWebResponsePost("http://localhost:1155/Web/2.aspx", "", "utf-8");
Response.Write(s);
}
//2.aspx
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("request page... Session Count:"+Session.Count);
Response.Write("<br>Session[\"ss\"]="+session["ss"].ToString();
}

//3.aspx
protected void Page_Load(object sender, EventArgs e)
{
//请求3.aspx得到HTML
string cookie="";
string outcookie="";
string s1 = HttpWebResponsePost("http://localhost:1155/Web/1.aspx", "", "utf-8",cookie,out outcookie);
string cookie2=outcookie;
string s2 = HttpWebResponsePost("http://localhost:1155/Web/2.aspx", "", "utf-8",cookie2,outcookie);
Response.Write(s2);
}

public static string HttpWebResponsePost(string url, string postData, string encodeType ,string cookie, out string outcookie)
{

Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.GetEncoding(encodeType);
byte[] data = encoding.GetBytes(postData);

try
{
request = WebRequest.Create(url) as HttpWebRequest;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
if(cookie != "")
{
request.CookieContainer.SetCookies(new Uri(url), cookie)
}
request.AllowAutoRedirect = true;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
outstream = request.GetRequestStream();

outcookie = request.CookieContainer.GetCookieHeader(new Uri(url))

outstream.Write(data, 0, data.Length);
outstream.Close();
response = request.GetResponse() as HttpWebResponse;
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
string content = sr.ReadToEnd();
return content;
}
catch (Exception ex)
{
return string.Empty;
}
}


路人乙e 2008-11-20
  • 打赏
  • 举报
回复
webrequest访问等于使用另一用户第一次打开网站
结果就是一切数据都是初始状态
brood108 2008-11-20
  • 打赏
  • 举报
回复
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
string cookie="ASP.NET_SessionId=spz5yqj0yqtilqftkl5tta3i";
request.CookieContainer.SetCookies(new Uri(url), cookie)

你这样才能给请求赋上session
但是因为session每次都是.net自动随机加密的
所以你要先用函数请求1.aspx 然后
outcookieheader = req.CookieContainer.GetCookieHeader(new Uri(url))

这样就取得了1.aspx输出的cookie
请求2.aspx的时候 在用我上面的方法带上cookie就可以了
zhu18 2008-11-20
  • 打赏
  • 举报
回复
request.CookieContainer = cookieContainer;
请教:这个属性就没有用吗,他不能帮我解决这个问题吗。
再次谢谢大家热心帮助。。
brood108 2008-11-20
  • 打赏
  • 举报
回复
得到的结果肯定是 Session Count:0

你这么做 原理是这样的:

首先你请求1.aspx 同时赋了session
然后你调函数访问2.aspx 这一步相当于你在一个全新的ie里打开2.aspx
这一步跟你之前的不在一个ie线程内自然不会共享session 所以是0啦
解决方法,你可以给你的函数增加一个参数 sessionstr
然后给httpwebrequest指定session
这样的话可以欺骗2.aspx让他带上指定session
zhu18 2008-11-20
  • 打赏
  • 举报
回复
TO:jiangzhe556
2.aspx一直就没有被打开过,是1.aspx在服务器端请求并返回2.aspx所生成HTML而已啊
加载更多回复(10)

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧