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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月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,如需转载请自行联系原作者
相关实践学习
小试牛刀,一键部署电商商城
SAE 仅需一键,极速部署一个微服务电商商城,体验 Serverless 带给您的全托管体验,一起来部署吧!
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2月前
|
安全 Linux 开发工具
【Azure Function】分享把Function App从.NET 6.0升级到.NET 8.0 Isolated的步骤
本文介绍了将Azure Function App从.NET 6.0升级到.NET 8.0 Isolated的步骤。.NET 6.0作为长期支持版本,生命周期至2024年11月结束。为确保持续支持,建议升级至更新版本。升级步骤包括安装.NET 8 SDK、更新Azure Functions Core Tools、修改项目文件目标框架为net8.0、更新兼容的NuGet包、本地测试以及重新发布到Azure。更多详细信息可参考官方文档。
102 9
|
4月前
|
JSON 数据格式
【Azure Fabric Service】演示使用PowerShell命令部署SF应用程序(.NET)
本文详细介绍了在中国区微软云Azure上使用Service Fabrics服务时,通过PowerShell命令发布.NET应用的全过程。由于Visual Studio 2022无法直接发布应用,需借助PowerShell脚本完成部署。文章分三步讲解:首先在Visual Studio 2022中打包应用部署包,其次连接SF集群并上传部署包,最后注册应用类型、创建实例并启动服务。过程中涉及关键参数如服务器证书指纹和服务端证书指纹的获取,并附带图文说明,便于操作。参考官方文档,帮助用户成功部署并运行服务。
155 72
|
4月前
|
存储 XML 开发工具
【Azure Storage Account】利用App Service作为反向代理, 并使用.NET Storage Account SDK实现上传/下载操作
本文介绍了如何在Azure上使用App Service作为反向代理,以自定义域名访问Storage Account。主要内容包括: 1. **设置反向代理**:通过配置`applicationhost.xdt`和`web.config`文件,启用IIS代理功能并设置重写规则。 2. **验证访问**:测试原生URL和自定义域名的访问效果,确保两者均可正常访问Storage Account。 3. **.NET SDK连接**:使用共享访问签名(SAS URL)初始化BlobServiceClient对象,实现通过自定义域名访问存储服务。
|
6月前
|
开发框架 安全 .NET
【Azure Developer】.NET Aspire 项目本地调试遇 Grpc.Core.RpcException 异常( Error starting gRPC call ... )
Error starting gRPC call. HttpRequestException: The SSL connection could not be established, see inner exception. AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot
128 12
|
8月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
180 32
|
8月前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
113 11
|
8月前
|
开发框架 监控 .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
118 5
|
9月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
166 9
|
9月前
|
安全 网络安全 数据安全/隐私保护
【Azure Developer】System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
125 2