WindiwsAzure下使用Cache服务共享Session的方法
在WindowsAzure上发布多实例的WebRole(即:WebRole的InstanceCount大于1)后,由于Azure的负载平衡程序会循环调用多个实例,所以,一般的默认存储在内存中的Session将出现混乱而直接导致应用程序瘫痪。
为了解决该问题,可以把Session存储在SQL Azure中,来达到多个实例共享Session的目的。但是,在此笔者提供另外一种存储Session的方式:使用AppFabric Cache服务存储Session。
操作步骤如下:
1、开通AppFabric Cache服务。
访问http://portal.appfabriclabs.com 这个CTP门户,在门户上选择“Cache”(缓存)选项,然后单击“New Namespace”(新命名空间)创建新的缓存。在弹出的对话框中设置唯一的服务命名空间和缓存大小,确定后即可开通。然后,会得到一个Service URL(服务URL)和Authentication Token(身份验证令牌)。服务 URL 是您的应用程序与 Caching 服务交互时要连接的 TCP 终结点。 身份验证令牌是要传递到 Access Control 的加密令牌,用于验证您的服务。
2、在Azure项目的WebRole中,添加AppFabric SDK提供的所有程序集。
这些程序集包括:
Microsoft.ApplicationService.Caching.Client
Microsoft.ApplicationService.Caching.Core
Microsoft.Web.DistributedCache
Microsoft.WindowsFabric.Common
Microsoft.WindowsFabric.Data.Common
3、修改Web.config文件使应用程序启用AppFabric Cache。
使 <configuration> 元素之后紧跟 <configSections> 和 <dataCacheClient> 元素(如果紧跟的是别的元素,您将收到错误)。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="dataCacheClient" type="Microsoft.ApplicationServer.Caching.DataCacheClientSection, Microsoft.ApplicationServer.Caching.Core"
allowLocation="true" allowDefinition="Everywhere"/>
</configSections>
<dataCacheClient>
<hosts>
<host name="YOURCACHE.cache.windows.net" cachePort="22233"/>
</hosts>
<securityProperties mode="Message">
<messageSecurity authorizationInfo="YOURTOKEN" />
</securityProperties>
</dataCacheClient>
</configuration>
4、修改Web.config文件使应用程序的Session存储在Cache服务中。
<?xml version="1.0"?>
<configuration>
<system.web>
<sessionState mode="Custom" timeout="20" customProvider="AppFabricCacheSessionStoreProvider">
<providers>
<add name="AppFabricCacheSessionStoreProvider"
type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache"
cacheName="default"/>
</providers>
</sessionState>
</system.web>
</configuration>
到此,已经完成把Session存储在Cache服务所需要的所有设置步骤,现在再存储Session,Session的值就已经保存在Cache服务中,并可以在多个实例间共享了,读者可以自己创建例子测试,在此不再赘述。
在Cache服务中,既然可以存储Session的值,当然可以存储应用程序所有想存储的值,比如:用户的登录名,计算的中间结果等等。具体的操作示例如下:
static void Main(string[] args)
{
DataCacheFactory dataCacheFactory = new DataCacheFactory();
DataCache dataCache = dataCacheFactory.GetDefaultCache();
Console.Write("Enter a value: ");
string value = Console.ReadLine();
dataCache.Put("key", value);
string response = (string)dataCache.Get("key");
Console.WriteLine("Your value: " + response);
}
最后,总结Caching 服务为开发人员提供的功能有:
1、针对会话状态和页面输出缓存的预置 ASP.NET 提供程序,使您无需修改应用程序代码即可加速 Web 应用程序。
2、缓存所有托管的对象,而且对于对象大小没有限制,没有本地缓存所需的序列化开销。