0

在asp.net webservice中如何使用session

by 刘武 17. 三月 2009 22:11

在使用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();
}

 

Tags: ,

技术生涯

0

利用模态DIV结合UpdateProgress防止页面重复提交

by 刘武 9. 三月 2009 22:27

页面在提交的时候可能因为服务器处理慢而导致用户多次重复的点击某个按钮,因此我们需要防止用户这么做,常见的方法是在客户端把该按钮disable掉,但页面处理完或出现错误的时候又需要恢复按钮的状态,这样操作起来往往比较复杂,在atlas页面中,我们可以利用模态DIV和UpdateProgress来实现同样的效果,实现起来也比较简单 。看下面的页面


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>无标题页</title>
    <style type="text/css">
    #modalDiv
    {
        position: absolute;
        top: 0%;
        left: 0%;
        width: 100%;
        height: 100%;
        z-index:1001;
        background-color: black;
        opacity:.60;
        filter: alpha(opacity=10);
    }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0">
            <ProgressTemplate>
                <div id="modalDiv">
                </div>
            </ProgressTemplate>
        </asp:UpdateProgress>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Button ID="Submit" runat="server"
                    OnClick="Submit_Click" Text="Submit" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </form>
</body>
</html>

Tags: , , , ,

技术生涯

0

怎么获取汉字的拼音缩写

by 刘武 2. 三月 2009 23:36

在google里找到这个方法,还挺实用的,特意收藏,以备以后查看:

/// <summary>
/// 获取中文拼音缩写
/// </summary>
/// <param name="strInput">输入的中文</param>
/// <returns>拼音缩写</returns>


public static string GetPYForShort(string strInput)
{
    string result = "";
    foreach (char c in strInput)
    {
        if ((int)c >= 33 && (int)c <= 126)
        {
            //保留字母和符号
            result += c.ToString();
        }
        else
        {
            result += GetPYChar(c.ToString());
        }
    }
    return result;
}

/// <summary>
/// 取单个字符的拼音声母
/// </summary>
/// <param name="c">要转换的单个汉字</param>
/// <returns>拼音声母</returns>


private static string GetPYChar(string cInput)
{
    byte[] array = new byte[2];
    array = System.Text.Encoding.Default.GetBytes(cInput);
    int i = (short)(array[0] - '\0') * 256 + ((short)(array[1] - '\0'));

    if (i < 0xB0A1) return "*";
    if (i < 0xB0C5) return "a";
    if (i < 0xB2C1) return "b";
    if (i < 0xB4EE) return "c";
    if (i < 0xB6EA) return "d";
    if (i < 0xB7A2) return "e";
    if (i < 0xB8C1) return "f";
    if (i < 0xB9FE) return "g";
    if (i < 0xBBF7) return "h";
    if (i < 0xBFA6) return "g";
    if (i < 0xC0AC) return "k";
    if (i < 0xC2E8) return "l";
    if (i < 0xC4C3) return "m";
    if (i < 0xC5B6) return "n";
    if (i < 0xC5BE) return "o";
    if (i < 0xC6DA) return "p";
    if (i < 0xC8BB) return "q";
    if (i < 0xC8F6) return "r";
    if (i < 0xCBFA) return "s";
    if (i < 0xCDDA) return "t";
    if (i < 0xCEF4) return "w";
    if (i < 0xD1B9) return "x";
    if (i < 0xD4D1) return "y";
    if (i < 0xD7FA) return "z";

    return "*";
}

Tags: ,

技术生涯

Powered by BlogEngine.NET 1.6.1.9  登录
Original Design by Laptop Geek, Adapted by onesoft