Windows Azure Cloud Service (15) 多个VM Instance场景下如何处理ASP.NET Session

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

  《Windows Azure Platform 系列文章目录

 

 

  Update 2015-04-06

  笔者对Azure中如何处理Session做了总结,请参考最新的文档:

  Windows Azure HandBook (4) 分析Windows Azure如何处理Session

 

 

 

  Update 2015-03-10

  对于多个Instance保留Session的方法,目前微软官方建议如下:

  1.使用Redis Cache

  2.在PaaS的Cloud Service里,使用In-Role Cache保留Session

  3.将Session保存到SQL Server VM中,并且配置Always-On实现高可用。

 

  另外根据微软官方的文档 http://support.microsoft.com/kb/2006191

  对于Asp.net应用程序来说,微软不支持将Session保存到SQL Azure中

  The workarounds provided here do not work for ASP.Net SQL Session State Management features.   Microsoft does not support SQL Session State Management using SQL Azure databases for ASP.net applications. 

  

   Update 2015-03-10 以下内容已经retired

  传统的ASP.NET应用程序是无状态的,但是我们可以使用Session来保存用户状态,比如保存用户名和密码等等。并且在一般情况下,一些已经部署好的应用程序的逻辑业务很多情况下都是基于Session状态的,而这个Session状态是保存在我们局域网的Web服务器上的。

  如果我们部署单个计算节点(1 instance)的Windows Azure 托管服务,Session就会保存在该托管服务器上。但是这样会遇到一个问题:之前几章我已经提到了,Fabric Controller会自动监控计算节点的的执行状态。如果我们部署的单实例的计算节点遇到了一些问题(比如硬件故障、宕机等),Fabric Controller会自动找寻不同的服务器并且重新启动该计算节点。那就会让我们的托管服务在短时间内无法正常运行和提供服务,可靠性降低了。

  为了提高Windows Azure的可靠性,微软建议一个托管服务至少需要2个instance。这样可以保证某一个计算节点在遇到问题无法提供正常服务的情况下,另外一个计算节点会持续运行并且提供服务。

  假设我们已经把Windows Azure的instance count设置成了2个计算节点(比如A和B),那我们还知道:因为Windows Azure会自动提供负载均衡(Load Balance,LB)的。这样会遇到这样的问题:我们在某一段时间内所有的业务都是由计算节点A来处理的,过了一段时间后A因为去处理比较复杂的计算服务,LB会把我们请求的处理直接交给计算节点B来处理。但是我们保存在A计算节点上的Session状态丢失了!计算节点B不知道之前的Session.

 

所以说,我们如果要把现有的Web应用程序迁移到Windows Azure平台上,对于Session的处理是需要非常注意的。

一.  对于一个计算节点(1 instance)的Windows Azure托管服务,使用现有的"Session[SESSION_NAME_KEY]"可以正常处理业务逻辑。但是因为可能因为计算节点遇到硬件故障等等问题,可靠性降低了。

 

二.  对于两个计算节点以上(2 instance or more)的Windows Azure托管服务,为了保证Session能够持久化,我们需要在现有的Web应用程序上进行修改:

(1)使用Azure Table Storage来保存Session,您可以在这里下载示例代码

你可以通过查找Windows Azure Platform Training kit来下载这个提供程序。在这个工具包中,有一个叫作AspProviders样例项目。你可以直接把这个项目添加到你的解决方案中,也可以使用程序集引用的方式,把那个DLL添加到你的项目中。

如果你引用了这个程序集,那么你必须修改你的web.config文件。打开你的配置文件,然后找到元素。删除现有的配置,然后把下面的代码粘贴上去。当你这么做的时候,记得把你真正的应用程序名写上去。

 

复制代码
 <!--SessionState Provider Configuration-->
<sessionState mode="Custom" customProvider="TableStorageSessionStateProvider">
<providers>
<clear/>
<add name="TableStorageSessionStateProvider"
type ="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider"/>
</providers>
</sessionState>
复制代码

 

 

-  原理是就是把我们的Session作为对象保存到Windows Azure的Table里,需要的时候再取出继续使用。

优点:  

-  价格相比使用SQL Azure要便宜,Windows Azure Storage每1GB每月只需要0.15美金。

缺点:

-  不能得到微软的官方支持。

-  性能可能不是非常好 (笔者试验了一下,有的时候性能不好)。

-  需要清理之前已经使用过的Session。

 

(2)使用SQL Azure Session Provider来保存Session,具体可以参考MSDN博客

-  原理是就是把我们的Session作为对象保存到SQL Azure的Table里,需要的时候再取出继续使用。

优点:

-  虽然价格比不上使用Table Storage便宜,但是还是可以承受的。

缺点:

-  不能得到微软的官方支持。

-  需要清理之前已经使用过的Session。

每次Session我们会新建一张表来保存Session。对于后续的Session请求,会先查询这张表是否已经存在。所以一旦Session超时,我们就需要删除超时的Session表。为了自动删除过期的Session,我们大部分使用Windows Azure Worker Role来执行删除表的动作。

 

(3)AppFabric Caching

AppFabric Caching实际上是微软推荐的选项并且得到微软官方支持。 AppFabric Caching分布式内存中的缓存服务。它是自动配置的基础上的Windows Server AppFabric Caching。

优点:

-  在内存中缓存,访问速度非常快
-  微软官方支持

缺点:

-  价格相对上面2个方法来说比较高。起始价格是128M 45美金 ,最高是4GB 325美金。

 

 参考资料:Various Options to Manage Session State in Windows Azure

 

 


本文转自Lei Zhang的博客博客园博客,原文链接:http://www.cnblogs.com/threestone/archive/2012/01/30/2332233.html,如需转载请自行联系原作者
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
4天前
|
区块链 C# Windows
PasteEx:一款.NET开源的Windows快捷粘贴神器
PasteEx:一款.NET开源的Windows快捷粘贴神器
33 17
|
4天前
|
Web App开发 C# Windows
一款.NET开源的Windows资源管理器标签页工具
一款.NET开源的Windows资源管理器标签页工具
|
2月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
72 32
|
21天前
|
弹性计算 开发框架 安全
基于云效 Windows 构建环境和 Nuget 制品仓库进行 .Net 应用开发
本文将基于云效 Flow 流水线 Windows 构建环境和云效 Packages Nuget 制品仓库手把手教你如何开发并部署一个 .NET 应用,从环境搭建到实战应用发布的详细教程,帮助你掌握 .NET 开发的核心技能。
|
2月前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
2月前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
2月前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。
|
3月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
111 9
|
5月前
|
开发框架 JavaScript 前端开发
【App Service】解决 .NET Profiler 报告打开后无数据加载的问题
【App Service】解决 .NET Profiler 报告打开后无数据加载的问题
|
5月前
|
存储 Linux 网络安全
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)