Silverlight 2实战技巧之“操作Cookies”
摘自《Silverlight 2完美征程》第13章13.2.4节“操作Cookies”(作者:李会军)
利用Silverlight提供的HtmlDocument对象,可以轻松实现在Silverlight操作Cookies。使用SetProperty和GetProperty可以实现Cookies读写,并且在HtmlDocument中提供已经封装好的Cookies属性。
现在通过一个示例来展示一下如何实现Cookie的读写。编写一个简单的用户界面,使其看起来如图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
当单击“设置”按钮后,可以看到,在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/。您可从中获取关于本书的样章、源代码以及相关信息。