2012-11-26 34 views
0

我将把我的ASP.NET MVC4应用程序作为一个冗余的Azure应用程序托管。在会话期间,该应用程序执行产生不可序列化的对象的计算昂贵的操作。对象的创建是可重复的;每次我需要该对象时,我都可以执行昂贵的操作,但我更愿意只是在第一次执行操作并保存该对象以备后用。Azure内存中会话状态?

我想在Azure中使用标准的分布式会话状态机制来存储常用的会话状态信息,但该机制要求会话数据是可序列化的。我可以使用另一种机制来缓存昂贵的创建,不可序列化的对象吗?

鲍勃

回答

1

做这些对象都被存储在集中存储,也可以将它们存储在“是InProc”会话状态?

如果没有,恐怕你需要将它们序列化成SQL Azure,文件,应用程序结构缓存等。

因此,要么找到一种方法,它们序列弄成持久化或将它们存储在RAM中,有一个额外的副本每个Web服务器上

+0

谢谢伊戈雷克!不,我不需要集中存储(显然需要序列化)。我正在寻找一些东西,可以根据需要在每个服务器实例上构建我的对象,并只保留本地副本以便在该服务器实例上重用。我是新来的整个网络编程的东西,所以我需要帮助弄清楚如何映射“InProc会话状态”和“将它们存储在RAM中”等基本术语映射到ASP.NET的魔术。 –

+0

这些对象是否对每个会话都是全局的?如果是这样,您可以在公共静态类中使用公共静态声明来声明这些声明(使用lock()语句包装它们的设置以防止出现多线程问题)。 http://stackoverflow.com/questions/5118610/asp-net-mvc-global-variables – Igorek

+0

迷人。好的,让我确保我理解这一点:我的web应用程序(无论是由Azure托管还是由某人的ASP.NET托管服务托管)都运行在一个或多个服务器实例的上下文中。每个服务器实例在启动时加载一次我的程序集,并将它们永久加载(或直到遇到不合时宜的结束)。因此,只要服务器存在,公共静态数据就会存在。顺便说一句,确保静态数据访问是线程安全的。 (接下来的评论...) –

2

由Windows Azure中提供的所有分布式缓存服务需要系列化目前,不仅共享缓存,但专用/共同定位缓存也是如此。

但是,如果您要在内存缓存中使用,则不需要序列化。但是这不利于扩展,并且如果只有一个实例,则可能无法获得天蓝色的SLA。

所以我的建议是优化你的序列化并尝试使用azure缓存。