Silverlight 2实战技巧之“操作Cookies”

摘自《Silverlight 2完美征程》第13章13.2.4节“操作Cookies”(作者:李会军)


利用Silverlight提供的HtmlDocument对象,可以轻松实现在Silverlight操作Cookies。使用SetProperty和GetProperty可以实现Cookies读写,并且在HtmlDocument中提供已经封装好的Cookies属性。
现在通过一个示例来展示一下如何实现Cookie的读写。编写一个简单的用户界面,使其看起来如图13-6所示。

图13-6

图13-6
编写设置Cookies的实现,得到Cookies字符串之后,使用SetProperty方法写入Cookies,如下面的示例代码所示:
C#
void btnSet_Click(object sender, RoutedEventArgs e)
{
    DateTime expiration = DateTime.UtcNow + TimeSpan.FromDays(2000);
    String cookie = String.Format("{0}={1};expires={2}",
                    this.txtKey.Text,
                    this.txtValue.Text,
                    expiration.ToString("R"));

    HtmlPage.Document.SetProperty("cookie", cookie);
}
编写读取Cookie的实现,如下面的示例代码所示:
C#
void btnRead_Click(object sender, RoutedEventArgs e)
{
    String[] cookies = HtmlPage.Document.Cookies.Split(';');

    String key = this.txtKey.Text;
    key += '=';

    foreach (String cookie in cookies)
    {
        String cookieStr = cookie.Trim();

        if (cookieStr.StartsWith(key, StringComparison.OrdinalIgnoreCase))
        {
            String[] vals = cookieStr.Split('=');
            if (vals.Length >= 2)
            {
                this.txtValue.Text = vals[1];
            }
        }
    }
}
编写删除Cookies的实现,只要设置Cookies的过期时间即可,如下面的示例代码所示:
C#
void btnDelete_Click(object sender, RoutedEventArgs e)
{
    String oldCookie = HtmlPage.Document.GetProperty("cookie") as String;
    DateTime expiration = DateTime.UtcNow - TimeSpan.FromDays(1);

    String cookie = String.Format("{0}=;expires={1}",
        this.txtKey.Text,
        expiration.ToString("R"));

    HtmlPage.Document.SetProperty("cookie", cookie);
}
运行效果如图13-7所示。

图13-7

图13-7
当单击“设置”按钮后,可以看到,在Temporary Internet Files文件夹中写入了Cookies。
项目开发中可能会经常用到Cookies操作,笔者总结了一个简单的Silverlight 2中操作Cookies帮助类,大家可以直接在自己的项目中使用,主要有如下几个功能:
写入Cookies
读取Cookies
删除Cookies
判断Cookies键值是否存在
该Cookies的帮助类完整代码如下所示:
C#
public class CookiesUtils
{
    public static void SetCookie(String key, String value)
    {
        SetCookie(key, value, null, null, null, false);
    }

    public static void SetCookie(String key, String value, TimeSpan expires)
    {
        SetCookie(key, value, expires, null, null, false);
    }

    public static void SetCookie(String key, String value, TimeSpan? expires,
        String path, String domain, bool secure)
    {
        StringBuilder cookie = new StringBuilder();
        cookie.Append(String.Concat(key, "=", value));

        if (expires.HasValue)
        {
            DateTime expire = DateTime.UtcNow + expires.Value;
            cookie.Append(String.Concat(";expires=", expire.ToString("R")));
        }

        if (!String.IsNullOrEmpty(path))
        {
            cookie.Append(String.Concat(";path=", path));
        }

        if (!String.IsNullOrEmpty(domain))
        {
            cookie.Append(String.Concat(";domain=", domain));
        }

        if (secure)
        {
            cookie.Append(";secure");
        }

        HtmlPage.Document.SetProperty("cookie", cookie.ToString());
    }

    public static string GetCookie(String key)
    {
        String[] cookies = HtmlPage.Document.Cookies.Split(';');

        String result = (from c in cookies
                        let keyValues = c.Split('=')
                        where keyValues.Length == 2 && keyValues[0].Trim() == key.Trim()
                        select keyValues[1]).FirstOrDefault();
        return result;
    }

    public static void DeleteCookie(String key)
    {
        DateTime expir = DateTime.UtcNow - TimeSpan.FromDays(1);

        string cookie = String.Format("{0}=;expires={1}",
            key, expir.ToString("R"));

        HtmlPage.Document.SetProperty("cookie", cookie);
    }

    public static bool Exists(String key, String value)
    {
        return HtmlPage.Document.Cookies.Contains(
            String.Format("{0}={1}", key, value)
            );
    }
}


Silverlight 2完美征程》已上市,本书配套网站:http://www.dotneteye.cn/silverlight/。您可从中获取关于本书的样章、源代码以及相关信息。

posted @ 2009-05-12 19:52  博文视点  阅读(383)  评论(0编辑  收藏  举报