【转】系统缓存全解析二:动态缓存(4)-第三方分布式缓存解决方案 Velocity
http://msdn.microsoft.com/zh-cn/library/ee851751.aspx (微软的Velocity项目介绍)
原文如下:
“Velocity”项目简介
概述
从磁盘或数据库中反复检索数据可能是应用程序的一个瓶颈。Microsoft Distributed Caching Service(代号为“Velocity”)提供了一种方法来在内存型缓存中存储数据,以供将来检索,消除了对从磁盘或数据存储器获取数据的需求。这可以显著提高应用程序的性能。此外,Velocity还支持缓存服务群集,这可以提高应用程序的可伸缩性。
目标
在本次动手实验中,您将学习如何:
• 安装和配置Velocity
• 基于Velocity API 的程序
• 在ASP.NET 中使用Velocity 的SessionState 提供程序
系统要求
您必须拥有以下工具才能完成本实验:
• Microsoft Visual Studio 2010
• MicrosoftDistributedCache-i386.msi
注意:Vista 可能需要您对其他提示进行确认,具体取决于您的安全设置。实验说明中将忽略这些提示。
安装
使用 Configuration Wizard 验证本实验的所有先决条件。要确保正确配置所有内容,请按照以下步骤进行。
注意:要执行安装步骤,您需要使用管理员权限在命令行窗口中运行脚本。
1. 如果之前没有执行,运行Training Kit 的 Configuration Wizard。为此,运行位于%TrainingKitInstallationFolder%\Labs\IntroToProjectVelocity\Setup 文件夹下的CheckDependencies.cmd 脚本。安装先决条件中没有安装的软件(如有必要请重新扫描),并完成向导。
注意:为了方便,本实验中管理的许多代码都可用于Visual Studio 代码片段。CheckDependencies.cmd文件启动Visual Studio 安装程序文件安装该代码片段。
练习
本次动手实验由以下练习组成:
1. 安装和运行Velocity
2. 直接基于Velocity 编程,将Velocity 作为泛型对象缓存
3. 在ASP.NET 中使用Velocity 的SessionState 提供程序
4. 各种类型的Velocity 缓存
如果我束手无策了怎么办?
该动手实验中的源代码包括一个最终文件夹,如果完成了每个练习的每一步,您可以在该文件夹中找到应该获取的Visual Studio 解决方案。如果需要其他帮助来完成练习,您可以使用该解决方案作为指南。
完成本实验的估计时间:120分钟。
下一步:
练习 1:安装和运行Velocity
练习 1:安装和运行Velocity
在本练习中,您将学习如何安装和配置Velocity。
注意: 要执行这些步骤,您需要本地管理员权限。
安装
您必须执行以下步骤来为本实验做好准备。
1. 通过以下链接下载Velocity Community Technology Preview 安装包MicrosoftDistributedCache-i386.msi:http://www.microsoft.com/downloads/details.aspx?FamilyId=B24C3708-EEFF-4055-A867-19B5851E7CD2&displaylang=en
2. 将MicrosoftDistributedCache-i386.msi 保存到C:\VS2010TrainingKit
3. 在本地PC 上创建C:\VelocityLab 文件夹。
4. 将该文件夹共享为\\localhost\VelocityLab
任务 1 –安装Velocity
在本任务中,您将安装Velocity 服务并设置默认设置。
5. 在Windows Explorer 中双击C:\VS2010TrainingKit\MicrosoftDistributedCache-i386.msi 运行它
6. 将出现欢迎屏幕。单击Next。
图 1 欢迎安装屏幕
7. 出现End User License Agreement 屏幕。如果接受许可证协议,请单击“I accept the terms in the license agreement”单选按钮。单击Next。
图 2 许可协议
8. 将出现“Ready To Install”屏幕。接受默认位置(C:\Program Files\Microsoft Distributed Cache) 并单击Install。
图 3 Ready to Install 屏幕
9. 在安装过程中,将提示您允许以下应用程序通过防火墙。单击OK 确认此操作。
图 4 允许应用程序通过防火墙
10. 安装之后,将出现Cache Host Configuration 屏幕。配置以下参数:
◦ 对于 Storage 位置类型,选择Shared network folder。
◦ 对于 Network path,键入“\\VS2010Labs\VelocityLab”。将VS2010Labs 更改为本地机器的网络名称。
◦ 接受 Service Port Number、Cluster Port Number 和 Max Cached Data Size 的默认值。
图 5 Cache Host Configuration
11. 要创建群集,单击Test Connection。出现确认提示后;单击yes 创建群集。
图 6 确认对话框
12. 创建群集后,将启用所有剩余控件,以继续配置Cache Host。设置以下参数以完成配置过程:
◦ 在 Cluster Name 处,键入“Cluster1。”
◦ 在 Cluster Size 处,选择Small (1-4) 单选按钮。
图 7 Cache Host Configuration
13. 单击Save & Close。
14. 出现一个汇总屏幕。单击Finish 按钮。
图 8 汇总屏幕
任务 2 –启动Velocity 群集
Microsoft Velocity 随带了一个命令行管理工具,用于管理群集和缓存。使用该工具启动Velocity 群集。
1. 启动Velocity Administration 工具。导航到 Start | All Programs | Microsoft Distributed Cache | Administration Tool - Microsoft Distributed Cache。出现 Velocity Administration Tool。
注意:在 Microsoft Windows Vista 和Microsoft Windows Server 2008 操作系统中,您必须右键单击"Velocity" PowerShell 快捷方式并选择Run as administrator 才能使缓存管理工具正常运行。
图 9 Velocity Administration Tool
2. 键入“Get-CacheHelp”查看列表和所有可用Velocity cmdlets 的简要描述。
图 10 帮助命令
3. 键入“get-cachehost”查看刚才安装的主机服务的状态。
注意:The service status is “DOWN”indicating that the service is not yet started.
4. 键入“start-cachecluster”启动群集。
图 11
启动缓存群集
下一步:
练习 1:验证
练习 1:验证
要验证是否正确执行了所有练习的步骤,执行以下步骤:
验证 1:验证服务是否启动
通过本验证,您将可以确保正确启动了群集。
确认存在 Velocity 服务并且已经启动。
打开 Services Applet。
1. 导航到Start | Control Panel。将出现控制面板。
2. 单击Classic View 显示控制面板小程序列表。
3. 双击Administrative Tools 图标。出现 Administrative Tools 小程序列表。
4. 双击Services 图标。找到名为Microsoft project code named “Velocity”的服务。其状态应该为“Started”。
图 12 检查服务是否正常运行
验证 2:群集正在运行
通过本验证,您将可以确保正确启动了群集。
1. 启动Velocity Administration 工具。导航到 Start | All Programs | Microsoft Distributed Caches | Administration Tool - Microsoft Distributed Cache。
2. 键入“get-cachehost”。确认至少列出了一个主机且状态为“SERVICE_UP”。
图 13 检查缓存主机的Service Status 是否为 SERVICE UP
下一步:
练习 2:直接基于Velocity 编程,将Velocity 作为泛型对象缓存
练习 2:直接基于Velocity 编程,将Velocity 作为泛型对象缓存
本练习展示开发人员如何直接基于Velocity 缓存编程,以缓存任何可序列化的.NET 对象。
注意:要验证每个步骤是否正确执行,建议在每次任务结束时构建解决方案。
任务 1 –创建使用Velocity 的Windows 窗体项目。
在本任务中,您将创建一个Windows 窗体应用程序,让缓存API 可用于该应用程序。
1. 从Start | All Programs | Microsoft Visual Studio 2010 | Microsoft Visual Studio 2010 打开Microsoft Visual Studio 2010。
2. 选择File | New Project。出现 New Project 对话框。
图 14
New Project 对话框
a. 从Project Type 树中选择 Visual Basic | Web 或Visual C# | Web。
b. 从Templates 列表中选择 ASP.NET Web Application。
c. 在Name 文本框中,输入揇emoVelocity1”
d. 将创建一个New Web 窗体项目。
3. 添加对缓存库的引用
a. 在Visual Studio 中打开 DemoVelocity1 项目,选择Project | Add Reference…,将出现 Add References 对话框。
b. 选择Browse 选项卡。
图 15 添加引用
c. 打开%ProgramFiles%\Microsoft Distributed Cache\V1.0 文件夹并选择CacheBaseLibrary.dll 和 ClientLibrary.dll。单击OK 按钮添加对这些库的引用。
4. 对Web.Config 做出以下更改:
a. 在配置部分中添加以下声明:
XML
<configSections>
<section name="dataCacheClient" type="Microsoft.Data.Caching.DataCacheClientSection, CacheBaseLibrary" allowLocation="true" allowDefinition="Everywhere"/>
</configSections>
注意: 这将告知应用程序如何解析web.config 缓存和日志部分中的信息
b. 将以下代码添加到“configSections”组之后的“configuration”部分:
XML
<dataCacheClient deployment="simple">
<localCache isEnabled="true" sync="TTLBased" ttlValue="300" />
<hosts>
<host name="localhost" cachePort="22233" cacheHostName="DistributedCacheService"/>
</hosts>
</dataCacheClient>
注意:这些部分将为web 应用程序提供有关如何配置缓存和日志的详细信息。
任务 2 –在缓存中存储/检索简单的数据
在本任务中,您将向项目添加一个web 窗体,添加代码来在缓存中存储和检索数据。
1. 在Solution Explorer 中双击 Default.aspx 文件,在Source 视图中将其打开。移除页面中<asp:Content> 标签内部的所有内容,并使用以下XHTML 标记替代:
ASPX
<table>
<tr>
<td><label>Key:</label></td>
<td ><asp:TextBox runat="server" ID="keyTextbox" /></td>
</tr>
<tr>
<td><label>Value:</label></td>
<td><asp:TextBox runat="server" ID="valueTxtBox" /></td>
</tr>
<tr>
<td colspan="2">
<asp:Button runat="server" id="addButton" Text="Add"/>
<asp:Button runat=server id="putButton" Text="Put"/>
<asp:Button runat=server id="getButton" Text="Get"/>
</td>
</tr>
<tr>
<td colspan="2">
<asp:Label runat="server" id="statusLabel"/>
</td>
</tr>
</table>
2. 切换到“Design”模式。您的web 窗体应该看起来如下所示:
图 16 Design 模式中的 Web 窗体
3. 邮件单击设计器并选择View Code,打开Default.aspx.vb (Visual Basic) 或 Default.aspx.cs (C#) 文件。
4. 将以下语句添加到顶部:
C#
using Microsoft.Data.Caching;
Visual Basic
Imports Microsoft.Data.Caching
5. 有必要在Session 中存储缓存对象,并在每次出现页面事件时检索该对象的相同实例。将该代码插入到页面类中,以将以下方法添加到页面:
(代码片段– Velocity 简介实验- 练习2 GetCurrentCache – C#)
C#
private DataCache GetCurrentCache()
{
DataCache dCache;
if (Session["dCache"] != null)
{
dCache = (DataCache)Session["dCache"];
}
else
{
var factory = new DataCacheFactory();
dCache = factory.GetCache("default");
Session["dCache"] = dCache;
}
return dCache;
}
(代码片段– Velocity 简介实验- 练习2 GetCurrentCache – VB)
Visual Basic
Private Function GetCurrentCache() As DataCache
Dim dCache As DataCache
If Not Session("dCache") Is Nothing Then
dCache = Session("dCache")
Else
Dim factory As New DataCacheFactory
dCache = factory.GetCache("default")
Session("dCache") = dCache
End If
Return dCache
End Function
注意:该方法查看Session 对象,了解是否存在标记为“dCache”的对象。如果存在,将从Session 中拉出该对象并返回。如果不存在,则创建一个新的缓存对象并存储在Session 中。注意,Cache对象不会直接实例化——使用工厂对象来创建Cache 对象。在需要访问缓存时,事件将在页面上调用该方法。
6. 返回到设计视图并双击AddButton 以创建一个用于按钮单击事件的处理程序。将以下代码添加到AddButton_Click。该代码向缓存添加一个新键/值对。缓存的Add 方法假设缓存中当前不存在该键。
(代码片段– Velocity 简介实验- Ex2 AddButton_Click – C#)
C#
var dCache = GetCurrentCache();
var key = keyTextbox.Text;
var val = valueTxtBox.Text;
if (key == "" || val == "") return;
try
{
dCache.Add(key, val);
statusLabel.Text =
string.Format("Successfully added key {0} to cache.", key);
}
catch (Exception ex)
{
statusLabel.Text =
string.Format("Error adding key {0} to cache: {1}",
key, ex.Message);
}
(代码片段 –Velocity 简介实验- 练习2 AddButton_Click – VB)
Visual Basic
Dim dCache = GetCurrentCache()
Dim key = keyTextbox.Text
Dim val = valueTxtBox.Text
If key Is "" OrElse val Is "" Then
Return
End If
Try
dCache.Add(key, val)
statusLabel.Text = String.Format("Successfully added key {0} to cache.",
key)
Catch ex As Exception
statusLabel.Text = String.Format("Error adding key {0} to cache: {1}",
key, ex.Message)
End Try
7. 返回到设计视图并双击PutButton以创建一个用于按钮单击事件的处理程序。将以下代码添加到PutButton_Click。该代码向缓存添加或更新一个新键/值对。缓存的Put 方法检查该键是否已经存在于缓存中。如果该键不存在,则添加一个;如果该键存在,则更新该键的值。
(代码片段– Velocity 简介实验–练习2 PutButton_Click – C#)
C#
var dCache = GetCurrentCache();
var key = keyTextbox.Text;
var val = valueTxtBox.Text;
if (key == "" || val == "") return;
try
{
dCache.Put(key, val);
statusLabel.Text =
string.Format("Successfully put key {0} to cache", key);
}
catch (Exception ex)
{
statusLabel.Text =
string.Format("Error putting key {0} to cache: {1}",
key, ex.Message);
}
(代码片段 –Velocity 简介实验- 练习2 PutButton_Click – VB)
Visual Basic
Dim dCache = GetCurrentCache()
Dim key = keyTextbox.Text
Dim val = valueTxtBox.Text
If key Is "" OrElse val Is "" Then
Return
End If
Try
dCache.Put(key, val)
statusLabel.Text = String.Format("Successfully put key {0} to cache",
key)
Catch ex As Exception
statusLabel.Text = String.Format("Error putting key {0} to cache: {1}",
key, ex.Message)
End Try
8. 返回到设计视图并双击GetButton以创建一个用于按钮单击事件的处理程序。将以下代码添加到GetButton_Click。如果该键存在于缓存中,则Get 方法检索相应的值;如果缓存中不存在该键,则Get 方法返回null。
(代码片段– Velocity 简介实验–练习2 GetButton_Click – C#)
C#
var dCache = GetCurrentCache();
var key = keyTextbox.Text;
if (key == "") return;
try
{
var val = dCache.Get(key).ToString();
valueTxtBox.Text = val;
statusLabel.Text =
string.Format("Successfully did Get of key {0} from cache", key);
}
catch (Exception ex)
{
statusLabel.Text =
string.Format("Error getting key {0} from cache: {1}",
key, ex.Message);
}
(代码片段 –Velocity 简介实验- 练习2 GetButton_Click – VB)
Visual Basic
Dim dCache = GetCurrentCache()
Dim key = keyTextbox.Text
If key Is "" Then
Return
End If
Try
Dim val = dCache.Get(key).ToString()
valueTxtBox.Text = val
statusLabel.Text = String.Format("Successfully did Get of key {0} from cache", key)
Catch ex As Exception
statusLabel.Text = String.Format("Error getting key {0} from cache:{1}", key, ex.Message)
End Try
a. 保存所有文件并选择Build | Build DemoVelocity1 编译项目
9. 按F5 以调试模式运行应用程序。测试不同的输入。在按钮单击事件中设置断点,以在实际运行中查看代码情况。对于要测试的特定操作,查看本练习的验证1 部分。
任务 3 –在缓存中存储/检索复杂的数据
在本任务中,您将向项目添加一个web 窗体,添加代码从缓存存储和检索可序列化对象。
注意:为了简便起见,我们不验证向所创建窗体的输入操作。用户必须小心地在每个窗体控件中输入合适的数据类型。例如,Employee ID 必须是整数,Hire Date 必须是有效日期。为生产环境编写的代码应该始终验证用户输入。
1. 向项目中添加一个新类。选择Project | Add Class。将类名称更改为“Employee”,然后单击Add 按钮。该类将添加到您的项目中并在类编辑器中打开。
2. 使用以下代码替换类定义。
(代码片段– Velocity 简介实验- 练习2 Employee 实体– C#)
C#
[Serializable]
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public DateTime HireDate { get; set; }
public int EmployeeID { get; set; }
}
(代码片段– Velocity 简介实验- 练习2 Employee 实体– VB)
Visual Basic
<Serializable()>
Public Class Employee
Public Property FirstName() As String
Public Property LastName() As String
Public Property Address() As String
Public Property HireDate() As DateTime
Public Property EmployeeID() As Integer
End Class
注意:该类标记为Serializable。对象必须序列化之后才能添加到缓存。该类的范围增加为public,允许类之外的代码访问。
3. 向项目中添加一个新的web 窗体。选择Project | Add New Item…。出现 Add New Item 对话框选择Web Form using Master Page 模板,接受默认名称“WebForm1.aspx”,然后选择Site.Master 主页面,单击 OK 按钮将Web 窗体添加到项目中。web窗体以设计模式出现在项目中。
4. 验证WebForm1.aspx 文件是否在“Source”视图中打开。将以下粗体XHTML 标记添加到<asp:Content> 标记和 ContentPlaceHolderID MainContent 之间:
ASPX
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<table>
<tr>
<td>Employee ID</td>
<td>
<asp:TextBox ID="EmployeeIDTextbox" runat="server" />
</td>
</tr>
<tr>
<td>First Name</td>
<td>
<asp:TextBox ID="FirstNameTextbox" runat="server" />
</td>
</tr>
<tr>
<td>Last Name</td>
<td>
<asp:TextBox ID="LastNameTextbox" runat="server" />
</td>
</tr>
<tr>
<td>Address</td>
<td>
<asp:TextBox ID="AddressTextbox" runat="server" />
</td>
</tr>
<tr>
<td>Hire Date</td>
<td>
<asp:TextBox ID="HireDateTextbox" runat="server" />
</td>
</tr>
</table>
<table>
<tr>
<td>
<asp:Button runat="server" ID="AddButton" Text="Add"/>
</td>
<td>
<asp:Button runat="server" ID="PutButton" Text="Put"/>
</td>
<td>
<asp:Button runat="server" ID="GetButton" Text="Get"/>
</td>
</tr>
</table>
<asp:Label runat="server" ID="StatusLabel" Text="Ready" />
</asp:Content>
5. 切换到“Design”模式。您的web 窗体应该看起来如下所示:
图 17 Design 模式中的 Web 窗体
6. 单击设计器界面然后选择View Code,将以下语句添加到代码文件顶部:
C#
using Microsoft.Data.Caching;
Visual Basic
Imports Microsoft.Data.Caching
7. 有必要在Session 中存储缓存对象,并在每次出现页面事件时检索该对象的相同实例。将该代码插入到页面类中,以将以下方法添加到页面:
(代码片段– Velocity 简介实验- 练习2 GetCurrentCache 2 - C#)
C#
private DataCache GetCurrentCache()
{
DataCache dCache;
if (Session["dCache"] != null)
{
dCache = (DataCache)Session["dCache"];
}
else
{
var factory = new DataCacheFactory();
dCache = factory.GetCache("default");
Session["dCache"] = dCache;
}
return dCache;
}
(代码片段– Velocity 简介实验- 练习2 GetCurrentCache 2 - VB)
Visual Basic
Private Function GetCurrentCache() As DataCache
Dim dCache As DataCache
If Session("dCache") IsNot Nothing Then
dCache = CType(Session("dCache"), DataCache)
Else
Dim factory = New DataCacheFactory()
dCache = factory.GetCache("default")
Session("dCache") = dCache
End If
Return dCache
End Function
8. 返回到设计视图并双击AddButton 以创建一个用于按钮单击事件的处理程序。将以下代码添加到AddButton_Click。该代码向缓存添加一个新键/值对。缓存的Add 方法假设缓存中当前不存在键(注意,我们使用对象的初始化程序功能取代Employee 对象的构造函数)。
(代码片段– Velocity 简介实验- 练习2 AddButton_Click 2 – C#)
C#
var dCache = GetCurrentCache();
var employeeID = Convert.ToInt32(EmployeeIDTextbox.Text);
var firstName = FirstNameTextbox.Text;
var lastName = LastNameTextbox.Text;
var address = AddressTextbox.Text;
var hireDate = Convert.ToDateTime(HireDateTextbox.Text);
var emp = new Employee
{
EmployeeID = employeeID,
FirstName = firstName,
LastName = lastName,
Address = address,
HireDate = hireDate
};
try
{
dCache.Add(employeeID.ToString(), emp);
StatusLabel.Text =
string.Format("Successfully added employee {0} to cache",
employeeID);
}
catch (Exception ex)
{
StatusLabel.Text =
string.Format("Error adding employee {0} to cache: {1}",
employeeID, ex.Message);
}
(代码片段 –Velocity 简介实验- 练习2 AddButton_Click 2 – VB)
Visual Basic
Dim dCache = GetCurrentCache()
Dim employeeID = Convert.ToInt32(EmployeeIDTextbox.Text)
Dim firstName = FirstNameTextbox.Text
Dim lastName = LastNameTextbox.Text
Dim address = AddressTextbox.Text
Dim hireDate = Convert.ToDateTime(HireDateTextbox.Text)
Dim emp = New Employee With {
.EmployeeID = employeeID,
.FirstName = firstName,
.LastName = lastName,
.Address = address,
.HireDate = hireDate
}
Try
dCache.Add(employeeID.ToString(), emp)
StatusLabel.Text = String.Format("Successfully added employee {0} to cache", employeeID)
Catch ex As Exception
StatusLabel.Text = String.Format("Error adding employee {0} to cache:{1}", employeeID, ex.Message)
End Try
9. 返回到设计视图并双击PutButton以创建一个用于按钮单击事件的处理程序。将以下代码添加到PutButton_Click。该代码向缓存添加或更新一个新键/值对。缓存的Put 方法检查该键是否已经存在于缓存中。如果该键不存在,则添加一个;如果该键存在,则更新该键的值。
(代码片段– Velocity 简介实验- 练习2 PutButton_Click 2 – C#)
C#
var dCache = GetCurrentCache();
var employeeID = Convert.ToInt32(EmployeeIDTextbox.Text);
var firstName = FirstNameTextbox.Text;
var lastName = LastNameTextbox.Text;
var address = AddressTextbox.Text;
var hireDate = Convert.ToDateTime(HireDateTextbox.Text);
var emp = new Employee
{
EmployeeID = employeeID,
FirstName = firstName,
LastName = lastName,
Address = address,
HireDate = hireDate
};
try
{
dCache.Put(employeeID.ToString(), emp);
StatusLabel.Text =
string.Format("Successfully added employee {0} to cache", employeeID);
}
catch (Exception ex)
{
StatusLabel.Text =
string.Format("Error putting employee {0} to cache:{1}", employeeID, ex.Message);
}
(代码片段 –Velocity 简介实验- 练习2 PutButton_Click 2 – VB)
Visual Basic
Dim dCache = GetCurrentCache()
Dim employeeID = Convert.ToInt32(EmployeeIDTextbox.Text)
Dim firstName = FirstNameTextbox.Text
Dim lastName = LastNameTextbox.Text
Dim address = AddressTextbox.Text
Dim hireDate = Convert.ToDateTime(HireDateTextbox.Text)
Dim emp = New Employee With {
.EmployeeID = employeeID,
.FirstName = firstName,
.LastName = lastName,
.Address = address,
.HireDate = hireDate
}
Try
dCache.Put(employeeID.ToString(), emp)
StatusLabel.Text = String.Format("Successfully added employee {0} to cache", employeeID)
Catch ex As Exception
StatusLabel.Text = String.Format("Error putting employee {0} to cache:{1}", employeeID, ex.Message)
End Try
10. 返回到设计视图并双击GetButton以创建一个用于按钮单击事件的处理程序。将以下代码添加到GetButton_Click。如果该键存在于缓存中,则Get 方法检索相应的值;如果缓存中不存在该键,则Get 方法返回null。
注意,对象必须强制转换为Employee 类型才能使用。这是因为从缓存返回的值总是System.Object 类型。
(代码片段– Velocity 简介实验- 练习2 GetButton_Click 2 – C#)
C#
var dCache = GetCurrentCache();
try
{
var emp = (Employee) dCache.Get(EmployeeIDTextbox.Text);
FirstNameTextbox.Text = emp.FirstName;
LastNameTextbox.Text = emp.LastName;
AddressTextbox.Text = emp.Address;
HireDateTextbox.Text = emp.HireDate.ToString();
StatusLabel.Text =
string.Format("Successfully did Get of employee {0} from cache", emp.EmployeeID);
}
catch (Exception ex)
{
StatusLabel.Text =
string.Format("Error getting employee {0} and {1}",
EmployeeIDTextbox.Text, ex.Message);
}
(代码片段 –Velocity 简介实验- 练习2 GetButton_Click 2 – VB)
Visual Basic
Dim dCache = GetCurrentCache()
Try
Dim emp = CType(dCache.Get(EmployeeIDTextbox.Text), Employee)
FirstNameTextbox.Text = emp.FirstName
LastNameTextbox.Text = emp.LastName
AddressTextbox.Text = emp.Address
HireDateTextbox.Text = emp.HireDate.ToString()
StatusLabel.Text = String.Format("Successfully did Get of employee {0} from cache", emp.EmployeeID)
Catch ex As Exception
StatusLabel.Text = String.Format("Error getting employee {0} and {1}", EmployeeIDTextbox.Text, ex.Message)
End Try
11. 将启动页面更改为WebForm1
a. 在Solution Explorer 中,右键单击WebForm1.aspx 并从弹出菜单中选择“Set As Start Page”
12. 保存所有文件并选择Build | Build DemoVelocity1 编译项目
13. 按F5 以调试模式运行应用程序。测试不同的输入。在按钮单击事件中设置断点,以在实际运行中查看代码情况。对于要测试的特定操作,查看本练习的验证2 部分。
下一步:
练习 2:验证
练习 2:验证
要验证是否正确执行了所有练习的步骤,执行以下步骤:
注意:在运行该验证之前,请确保缓存群集能正常运行。为此,执行练习1:安装和运行Velocity 的任务3 –启动 Velocity 群集中的描述的步骤。
验证 1:运行项目并测试缓存简单的数据
在本验证中,您将运行项目,向Default.aspx 输入数据并测试为了添加、更新以及从缓存获取数据而编写的代码。
1. 在Solution Explorer 中,右键单击Default.aspx 并从弹出菜单中选择“Set As Start Page”
2. 按F5 运行应用程序。应该出现Default.aspx,其中应该包含您添加的文本框和按钮。
图 18 默认页面
3. 将一个值添加到缓存。
a. 在Key 文本框中输入“Item1”。
b. 在Value 文本框中输入“This is Item1”。
c. 单击Add 按钮。
d. 按钮下的标签应该显示文本“Successfully added key Item1 to cache”。
e. 在Key 文本框中输入“Item2”。
f. 在Value 文本框中输入“This is Item2”。
g. 单击Add 按钮。
h. 按钮下的标签应该显示文本“Successfully added key Item2 to cache”。
4. 尝试将一个重复键添加到缓存中。
a. 在Key 文本框中输入“Item1”。
b. 在Value 文本框中输入“This is the new value for Item1”。
c. 单击Add 按钮。
d. 按钮下的标签应该显示一条错误消息。
5. 使用Put 方法在缓存中更新项目。
a. 在Key 文本框中输入“Item1”。
b. 在Value 文本框中输入“This is the new value for Item1”。
c. 单击Put 按钮。
d. 按钮下的标签应该显示文本“Successfully put key Item1 to cache”。
6. 从缓存获取一项。
a. 在Key 文本框中输入“Item2”。
b. 删除Value 文本框中的所有文本。
c. 单击Get 按钮。
d. 按钮下的标签应该显示文本“Successfully did Get of key Item1 to cache”。
7. 尝试获取缓存中没有的项。
a. 在Key 文本框中输入“Item5”。
b. 删除Value 文本框中的所有文本。
c. 单击Get 按钮。
d. 按钮下的标签应该显示一条错误消息。
验证 2:运行项目并测试缓存复杂的数据
在本验证中,您将运行项目,向Form2 输入数据并测试为了添加、更新以及从缓存获取数据而编写的代码。
1. 在Solution Explorer 中,右键单击WebForm1.aspx 并从弹出菜单中选择“Set As Start Page”。
2. 按F5 运行应用程序。应该出现WebForm1,其中应该包含您添加的文本框和按钮。
图 19 次级页面
3. 将一个值添加到缓存。
a. 在Employee ID 文本框中输入“1”。
b. 在First Name 文本框中输入“George”。
c. 在Last Name 文本框中输入“Bush”。
d. 在Address 文本框中输入“Kennebunkport, ME”。
e. 在Hire Date 文本框中输入“1/20/1989”。
f. 单击Add 按钮。
g. 按钮下的标签应该显示文本“Successfully added key 1 to cache”。
h. 在Employee ID 文本框中输入“2”。
i. 在First Name 文本框中输入“Bill”。
j. 在Last Name 文本框中输入“Clinton”。
k. 在Address 文本框中输入“Hope, AR”。
l. 在Hire Date 文本框中输入“1/20/1993”。
m. 单击Add 按钮。
n. 按钮下的标签应该显示文本“Successfully added key 2 to cache”。
4. 尝试将一个重复键添加到缓存中。
a. 在Employee ID 文本框中输入“1”。
b. 在First Name 文本框中输入“Jimmy”。
c. 在Last Name 文本框中输入“Carter”。
d. 在Address 文本框中输入“Plains, GA”。
e. 在Hire Date 文本框中输入“1/19/1977”。
f. 单击Add 按钮。
g. 按钮下方的标签应该显示一条错误消息,因为键“1”已经存在于缓存中。
5. 使用Put 方法在缓存中更新项目。
a. 在Employee ID 文本框中输入“1”。
b. 在First Name 文本框中输入“Ronald”。
c. 在Last Name 文本框中输入“Reagan”。
d. 在Address 文本框中输入“1600 Pennsylvania”。
e. 在Hire Date 文本框中输入“2/6/1981”。
f. 单击Put 按钮。
g. 按钮下的标签应该显示文本“Successfully put key Item1 to cache”。
6. 从缓存获取一项
a. 在Employee ID 文本框中输入“2”。
b. 删除窗体上其他文本框中的所有文本。
c. 单击Get 按钮。
d. 按钮下的标签应该显示文本“Successfully did Get of key 2 from cache”。
e. 文本框应该显示关于员工2 的信息(如果按照上述步骤进行的话应该是Bill Clinton)。
7. 尝试获取缓存中没有的项。
a. 在Employee ID 文本框中输入“5”。
b. 删除窗体上其他文本框中的所有文本。
c. 单击Get 按钮。
d. 按钮下的标签应该显示一条错误消息。
下一步:
练习 3:在 ASP.NET 中使用Velocity 的SessionState 提供程序
练习 3:在 ASP.NET 中使用Velocity 的SessionState 提供程序
本练习展示如何挂钩ASP.NET 以使用外部Velocity SessionState 提供程序。这将得到“两全其美”的结果:一方面支持流程外的会话处理,另一方面又不会影响基于SQL 的会话管理性能。
注意:要验证每个步骤是否正确执行,建议在每次任务结束时构建解决方案。
注意:对于本实验,您应该以管理员权限运行Visual Studio 2010。这样您才能调试代码和访问必需的配置文件。
任务 1 –在Visual Studio 中创建一个网站
在本任务中,您将创建一个web 应用程序,让缓存API 可用于该应用程序。
1. 打开Microsoft Visual Studio 2010,选择 Start | All Programs | Microsoft Visual Studio 2010,右键单击Microsoft Visual Studio 2010 并选择 Run as administrator。
2. 选择File | New | New Project...出现 New Project 对话框。
图 20 New Project 对话框
a. 在Project Types 中选择 Visual Basic 或Visual C#。
b. 在Templates 下,选择 ASP.NET Web Application
c. 将网站命名为“DemoVelocity2”
3. 添加对缓存库的引用
a. 在Visual Studio 中打开 DemoVelocity2 项目,选择Project | Add Reference…,将出现 Add References 对话框。
b. 选择Browse 选项卡。
图 21 Add Reference 对话框
c. 打开C:\Program Files\Microsoft Distributed Cache\V1.0 文件夹并选择CacheBaseLibrary.dll 和 ClientLibrary.dll。单击OK 按钮添加对这些库的引用。
4. 修改web.config 文件以支持缓存
a. 添加以下声明:
XML
<configSections>
<section name="dataCacheClient" type="Microsoft.Data.Caching.DataCacheClientSection, CacheBaseLibrary" allowLocation="true" allowDefinition="Everywhere"/>
</configSections>
b. 将以下代码添加到“configSections”组之后的“configuration”部分:
XML
<dataCacheClient deployment="simple">
<localCache isEnabled="true" sync="TTLBased" ttlValue="300" />
<hosts>
<!--List of services -->
<host name="localhost" cachePort="22233" cacheHostName="DistributedCacheService"/>
</hosts>
</dataCacheClient>
c. 将以下代码添加到“system.web”部分。该部分告知web 应用程序使用Velocity 提供程序处理所有SessionState 请求。
XML
<sessionState mode="Custom" customProvider="Velocity">
<providers>
<add name="Velocity" type="Microsoft.Data.Caching.DataCacheSessionStoreProvider, ClientLibrary" />
</providers>
</sessionState>
5. 添加代码,在一个页面上将数据存储到会话中。
a. 在Solution Explorer 中双击 Default.aspx 文件,在Source 视图中将其打开。移除页面中<asp:Content> 标签内部的所有内容,并使用以下XHTML 标记替代:
ASPX
<table>
<tr>
<td><label>Enter your Name:</label></td>
<td ><asp:TextBox runat="server" ID="NameTextbox" /></td>
</tr>
<tr>
<td>
<asp:Button runat="server" id="SaveNameButton" Text="Save Name"
onclick="SaveNameButton_Click"/>
</td>
</tr>
</table>
b. 切换到“Design”模式。您的web 窗体应该看起来如下所示:
图 22 Design 模式中的 Web 窗体
c. 双击“SaveName”按钮打开代码编辑器。将以下代码添加到SaveNameButton_Click 方法。这将用户输入的名称保存到会话对象中。
(代码片段– Velocity 简介实验- 练习3 SaveNameButton_Click – C#)
C#
if (NameTextbox.Text == "") return;
Session["YourName"] = NameTextbox.Text;
Response.Redirect("WebForm1.aspx");
(代码片段– Velocity 简介实验- 练习3 SaveNameButton_Click – VB)
Visual Basic
If NameTextBox.Text = "" Then
Return
End If
Session("YourName") = NameTextBox.Text
Response.Redirect("WebForm1.aspx")
6. 添加逻辑,从会话中检索数据
a. 向网站添加一个新页面。选择Project | Add New Item…。出现 Add New Item 对话框
b. 从Templates 列表中选择 Windows Web Form using Master Page。
c. 保留默认名称“WebForm1.aspx”
d. 单击Add 按钮并选择Site.Master 主页。Visual Studio 向网站添加了一个新页面WebForm1.aspx,并在编辑器中打开该页面。单击编辑器的Design 选项卡查看设计界面。
e. 将一个标签从Toolbox 中拖动到WebForm1.aspx 的设计界面上。将其ID 设置为“GreetingLabel”,将其Text 属性设置为“Unknown User”。
图 23 WebForm1 页面设计
f. 双击WebForm1.aspx 设计界面的空白部分打开该窗体的代码窗口。在Page_Load 方法中输入以下代码。这将从会话对象中检索值并显示在页面上。
(代码片段– Velocity 简介实验- 练习3 Page_Load – C#)
C#
if (Session["YourName"] == null)
{
GreetingLabel.Text = "Unknown User";
}
else
{
GreetingLabel.Text = "Hello " + Session["YourName"].ToString();
}
(代码片段–Velocity 简介实验- 练习3 Page_Load – VB)
Visual Basic
If Session("YourName") Is Nothing Then
GreetingLabel.Text = "Unknown User"
Else
GreetingLabel.Text = "Hello " & Session("YourName").ToString()
End If
g. 保存所有文件并编译网站。
下一步:
练习 3:验证
练习 3:验证
要验证是否正确执行了所有练习的步骤,执行以下步骤:
注意:在运行该验证之前,请确保缓存群集能正常运行。为此,执行练习1:安装和运行Velocity 的任务5 –启动 Velocity 群集中的描述的步骤。
1. 按F5 运行网站。
2. 导航到页面default.aspx 并输入您的名字。
3. 导航到页面WebForm1.aspx。从会话/缓存中检索之后,系统将显示您的名字。
下一步:
练习 4(可选):在群集中配置Velocity 缓存
练习 4(可选):在群集中配置Velocity 缓存
Velocity 在缓存分布在多台机器上时最为有效。这可以增加应用程序的可伸缩性。在本练习中,我们将在多台机器上安装Velocity 并配置缓存以使用每台机器。如果处于实验室环境中,您可能无法完成该练习。
任务 1 –在第二台PC 上安装Velocity
在本任务中,我们将在第二台PC 或虚拟PC 上安装Velocity。
1. 移动到第二台PC 或虚拟PC,这台PC 必须与您执行上一个练习时使用的PC 位于同一个域或工作组。如本实验的练习1 所述,在此PC 上安装Velocity。
2. 在Cache Host Configuration 屏幕上,确保指定的Cluster Name (“Cluster1”) 与在第一台PC 上安装Velocity 时使用的相同。
图 24 Cache Host Configuration
任务 2 –配置Velocity 以使用Multiple PC
为了让每个 Velocity 服务感知到群集中的其他机器,您必须修改ClusterConfig.xml。该文件位于 Cluster Configuration Share 下的“Cluster1”目录中。在本实验中,它将位于c:\VelocityLab 目录中。
1. 在安装了Velocity 的两台PC 上使用记事本打开c:\VelocityLab ClusterConfig.xml。该 XML 文件的<hosts> 部分应该列出了一个主机。例如:
XML
<hosts>
<host name="PC1" hostId="1616225007" quorumHost="True"
cacheHostName="DistributedCacheService" cachePort="22233"
clusterPort="22234" size="2048" lowWaterMark="70"
highWaterMark="90" />
</hosts>
2. 向每个文件添加第二个<host> 元素,指定将属于群集的另一台PC 的名称。
注意:最简单的实现方式是从另一台PC 的ClusterConfig.xml 文件中复制 <host> 元素。
完成之后,<hosts> 部分应该类似如下XML。
XML
<hosts>
<host name="PC1" hostId="1616225007" quorumHost="True"
cacheHostName="DistributedCacheService" cachePort="22233"
clusterPort="22234" size="2048" lowWaterMark="70"
highWaterMark="90" />
<host name="PC2" hostId="1616225008" quorumHost="True"
cacheHostName="DistributedCacheService" cachePort="22233"
clusterPort="22234" size="2048" lowWaterMark="70"
highWaterMark="90" />
</hosts>
注意:群集中的主机需要通过远程访问彼此通信,因此必须提供有效凭据才能执行一些操作,比如访问共享配置存储器,访问和启动/停止远程主机的服务等。如果使用对所有主机具有管理员权限的域账户安装Velocity,这些访问权限都将很容易配置。
有关更多信息,请参见http://social.msdn.microsoft.com/forums/en-US/velocity/thread/402b9465-f157-42a8-9a08-9e1a47a66783/
3. 将“PC1”和“PC2”替换为每台PC 的机器名。
下一步:
总结
总结
在本实验中,您安装并使用Microsoft Distributed Caching Service (“Velocity”) 来缓存资源和加速对数据检索的访问。
您通过 API 访问缓存,并配置了一个网站,使用Velocity 存储其会话状态。您还实验了各种类型的缓存配置。