zoukankan      html  css  js  c++  java
  • 在asp.net webservice中如何使用session

    原文地址:http://www.liuwu.net/post/use-session-state-in-aspnet-webservice.aspx

    在使用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


    <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
            <asp:Button ID="btnLogin" runat="server"
                Text="Login" OnClick="btnLogin_Click" />
        </div>
        <div>
            <asp:Button ID="btnGetName" runat="server"
                Text="GetName" OnClick="btnGetName_Click" />
            <asp:Label ID="lblName" runat="server" Text="Label"></asp:Label>
        </div>
    </form>

    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

  • 相关阅读:
    在IE和Firfox获取keycode
    using global variable in android extends application
    using Broadcast Receivers to listen outgoing call in android note
    help me!virtual keyboard issue
    using iscroll.js and iscroll jquery plugin in android webview to scroll div and ajax load data.
    javascript:jquery.history.js使用方法
    【CSS核心概念】弹性盒子布局
    【Canvas学习笔记】基础篇(二)
    【JS核心概念】数据类型以及判断方法
    【问题记录】ElementUI上传组件使用beforeupload钩子校验失败时的问题处理
  • 原文地址:https://www.cnblogs.com/kaka8384/p/1828237.html
Copyright © 2011-2022 走看看