随心所欲

做个幸福的人
posts - 158, comments - 1617, trackbacks - 28, articles - 0
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理
原理:WebService的会话保存仅能使用一个唯一的cookie来标示!
也就是server.CookieContainer=new System.Net.CookieContainer();
这样写,在window程序中没有问题,只要是全局性的。但是在web下边就不行了。因为用户每次提交都是一个新的网页,cookie不一定能被保存。


基于Web下的WebService之间的会话保存

在Page_Load里面:

if(!IsPostBack)//在网页载入时注册一个cookie
{
PLPTest2.GetService.MyService server=new PLPTest2.GetService.MyService();
             
CookieContainer c=new System.Net.CookieContainer();
        server.CookieContainer=c;//不注册cookie,WebSerive就不能识别一个用户,即使WebSerice的WebMethod(true)
        Session["cookie"]= c;//保存到Session中。不保存的cookie,怕是不能及时获得这个对象,还怕用户禁用cookie。
}


在应用时:

CookieContainer c=(CookieContainer)Session["cookie"];//获得保存的cookie,保证唯一。WebService就是通过这个唯一的cookie来确定会话的。
PLPTest2.GetService.MyService server=new PLPTest2.GetService.MyService();
server.CookieContainer=c;//赋值
server.YourName("Test");//执行WebService
Session["cookie"]= c;//把执行之后的cookie再次记录下来。很重要! 

Feedback

#1楼  回复 引用 查看   

2008-01-03 21:52 by 森林鸟      
还是没明白,我在其它服务器调用这个Web Service,是同一个站点,
还能保存会话状态吗?
希望你能写一个例子,我正需要这个

#2楼[楼主]  回复 引用 查看   

2008-01-04 10:47 by 随心所欲      
@森林鸟
原理就是要保存cookie。
在第一次连接时保留下来,以后每次使用的时候都指定使用这个cookie,就可以了。

例子上边就有。

#3楼  回复 引用 查看   

2008-01-05 10:04 by 森林鸟      
还是没有搞懂,我真的还没搞明白,你详细帮我写下吧,谢谢了
假如我WebService是这样的
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;


///
/// LoginService 的摘要说明
///

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class LoginService : System.Web.Services.WebService {

public LoginService () {

//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}

[WebMethod]
public string HelloWorld() {
return "Hello World";
}

[WebMethod(EnableSession=true)]
public string GetLoginUserId()
{
if (Session["User_Id"] == null)
return string.Empty;
else
return Session["User_Id"].ToString();
}

}

那么在其它地方调用这个WebService时,怎么通过GetLoginUserId取得Session["User_Id"] 的值

#4楼[楼主]  回复 引用 查看   

2008-01-05 12:40 by 随心所欲      
@森林鸟
保存会话状态,和你具体的webservice的逻辑无关。

LoginService server=new LoginService ;

CookieContainer c=new System.Net.CookieContainer();
server.CookieContainer=c;
Session["cookie"]= c;//保存到Session中。下次再把这个场景归还给那个webservice,他就知道是你上次的状态了。
}


在应用时:

CookieContainer c=(CookieContainer)Session["cookie
LoginService server=new LoginService() ;
server.CookieContainer=c;//赋值
server.GetLoginUserId();//这样可以得到你上次登录时候的名字。不过这个逻辑对客户端没有什么意义。服务器上倒是可以使用这个值。
Session["cookie"]= c;//把执行之后的cookie再次记录下来。很重要!

#5楼  回复 引用 查看   

2011-03-14 11:06 by 05pretender      
楼主,你好,我想问一下,为什么我的webservice没有CookieContainer属性哪
Google