博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在webservice中使用session和cookie
阅读量:5102 次
发布时间:2019-06-13

本文共 3037 字,大约阅读时间需要 10 分钟。

要在webservice中使用session,
 
1.需要在服务端的方法中加入[WebMethod(EnableSession=true)]修饰方法,
2.在客户端,要在实例化了webservice代理类之后,要为它的CookieContainer 实例化一个 new CookieContainer();
这样才能使用session存储状态。
3.另外在多个webservice代理中,只要含有相同的cookie,就能共用相同的session,其中的cookie通过代理类的CookieContainer.GetCookies(new Uri(s.Url))["ASP.NET_SessionId"]取得,如果其他的webserivce代理类需要用相同的session则可以用CookieContainer.Add方法,将取得的cookie加入即可。
如果只想使用cookie,则只需要在客户端做设置就可以,服务器端不需要像session一样加入属性修饰。
另外webmethod只用于public的成员方法,不用于static的,虽然不报错,但在客户端代理类中是找不到static方法的。
 
 
 

在使用asp.net编写webservice时,默认情况下是不支持session的,但我们可以把WebMethod的EnableSession选项设为true来显式的打开它,请看以下例子:

1 新建网站WebSite 

2 新建web服务WebService.asmx,它具有以下两个方法:

[WebMethod(EnableSession = true)]public string Login(string name){    Context.Session["name"] = name;    return name;}[WebMethod(EnableSession = true)]public string GetName(){    if (Context.Session["name"] != null)        return Context.Session["name"].ToString();    else        return "";}

3 添加asp.net页面SessionInWebservice.aspx

SessionInWebservice.aspx.cs

protected void btnLogin_Click(object sender, EventArgs e){    WebService ws = new WebService();        ws.Login(txtName.Text);}protected void btnGetName_Click(object sender, EventArgs e){    WebService ws = new WebService();    lblName.Text = ws.GetName();}

  

问题似乎到此结束了,按Login按钮记录用户名以后,再按GetName就可以获取到刚才输入的名字。

但如果我们另外新建一个website,并添加web引用来调用刚才编写的webservice,问题就出来了,GeName方法并没有获取到我们刚才登录的用户名(如果是在winform中调用该方法,也会出现同样的问题)。莫非这个方法行不通了?

其实不然,我们给该WebService的CookieContainer赋值就可以了,修改SessionInWebservice.aspx.cs 的代码:

private static System.Net.CookieContainer cookieContainer     = new System.Net.CookieContainer();protected void btnLogin_Click(object sender, EventArgs e){    localhost.WebService ws = new localhost.WebService();    ws.CookieContainer = cookieContainer;    ws.Login(txtName.Text);}protected void btnGetName_Click(object sender, EventArgs e){    localhost.WebService ws = new localhost.WebService();    ws.CookieContainer = cookieContainer;    lblName.Text = ws.GetName();}

请注意:Login方法和GetName方法必须指定同一个CookieContainer,因此在这里我们使用了静态变量。

但如果是在不同的页面中调用该webservice,问题依旧存在,因此我们需要重新修改代码,通过编写新类继承上面的webservice,并给CookieContainer赋值就可以解决该问题了: 

public class WebService1:localhost.WebService{    private static System.Net.CookieContainer cookieContainer;    static WebService1()    {        cookieContainer = new System.Net.CookieContainer();    }    public WebService1()    {        this.CookieContainer = cookieContainer;    }}

调用的时候也不需要重新给CookieContainer赋值了:

protected void btnLogin_Click(object sender, EventArgs e){    WebService1 ws = new WebService1();    ws.Login(txtName.Text);}protected void btnGetName_Click(object sender, EventArgs e){    WebService1 ws = new WebService1();    lblName.Text = ws.GetName();}

  

ps:在实际使用时发现在如果调用webservice的两个页面是在同一个网站里可以,如果分别是2个不同网站的页面就还是不能使用同一个session

 

http://www.cnblogs.com/Jan_Dai/archive/2011/04/01/2001742.html

转载于:https://www.cnblogs.com/jhlong/articles/5693874.html

你可能感兴趣的文章
RDLC报表系列(五) 简单的图表-柱状图
查看>>
[认证授权] 4.OIDC(OpenId Connect)身份认证授权(核心部分)
查看>>
在SQL Server中对视图进行增删改
查看>>
SQL Server 数据库所有表增加同一列
查看>>
一步一步学习SignalR进行实时通信_3_通过CORS解决跨域
查看>>
JS中5秒中跳转到其他页面
查看>>
MVC5 + EF6 + Bootstrap3 (11) 排序、搜索、分页
查看>>
高效的SQLSERVER分页查询(推荐)
查看>>
FTP文件服务搭建与同步传输
查看>>
Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用
查看>>
使用 SQL Server 2012 Analysis Services Tabular Mode 表格建模 图文教程
查看>>
EscapeDataString URI 字符串太长
查看>>
EasyUi通过POI 实现导出xls表格功能
查看>>
课堂讨论
查看>>
使用代理为业务操作添加安全检测
查看>>
rails--bcrypt对密码加密
查看>>
java类的定义
查看>>
ADO.NET 【攻击及防御】
查看>>
程序员vim的最终解决方案
查看>>
数据库
查看>>