1. 概述
本章内容包括 如何选择状态管理架构、考虑扩展性、使用cookie和本地存储保存状态、web.config中的配置 以及 实现sessionless状态。
2. 主要内容
2.1 选择状态管理架构
① 首先需要考虑的问题是,你是否真的需要保存状态。无状态使得站点可以处理更多的并发访问。
② web forms 中有多种方式保存状态。最主要的就是ViewState。使用隐藏域来实现状态信息的传递。
③ MVC4程序中,状态信息可以保存在以下位置:Cache、Session、Cookies、QueryString、Context.Items、Profile。
④ 可以通过继承 SessionStateStoreProviderBase 类来自定义session管理。
2.2 考虑扩展性
① 相对于传统的ASP.NET,ASP.NET MVC 可以创建简洁干净的Html输出。可以更好的适配需要html交互的环境。
② 可以使用 OutProc, StateServer, SQLServer session 或者 sessionless 方案。
web farm中,可以使用OutProc方案。
sessionless方案使用,取决于状态信息保存在哪里。保存在客户端,需要额外的客户端编码,并且需要检查浏览器的版本(是否支持)。
保存在服务端的典型案例是Profile的使用。里面保存了授权用户的信息。
③ ASP.NET MVC4 提供了支持可扩展性的多个特性。通过Routing和Model捕获,提供了对sessionless的支持。
还可以把各层封装成独立的组件,在各个服务器间公用。
2.3 使用cookies或者本地存储来保存状态信息
cookies是HTML5 Web Storage的前身,HTML5 的 web storage API,可以提供更简洁方便的操作。
HTML5 web storage 提供了 sessionStorage 和 localStorage 两个对象供使用。
sessionStorage可以在同一域名的网页间传递保存的数据,前提是浏览器窗口没有关闭。
localStorage 可以在同一域名的网页间传递保存的数据,作用域更大。不受浏览器窗口的限制。
The HTML5 Web Storage API 还支持事件。可以在localStorage信息变化时通知注册事件的多个页面。不会通过服务端。
浏览器兼容是需要考虑的问题,可以在服务端和客户端都放置检测代码。
2.4 在web.config中配置
<system.web>
<sessionState mode="InProc" cookieless="false" timeout="20"
sqlConnectionString="data
source=127.0.0.1;Trusted_Connection=yes"
stateConnectionString="tcpip=127.0.0.1:42424"
/>
</system.web>
<system.web>
<sessionState mode="StateServer"
stateConnectionString="192.168.1.103:42424" />
</system.web>
<profile defaultprovider="DefaultProfileProvider"
inherit="MyApplication.Models.CustomProfile"/>
2.5 实现sessionless状态
sessionless状态 指的是 在不支持任何session模式的情况下保存状态。
ASP.NET MVC 4 中在请求间传递信息的几种方式:
① 用户第一次访问时,在服务端创建并保存,然后传递。
② 使用隐藏域保存并传递。
③ 可以在布局页或者母版页中创建,在内容页中共享。
④ 添加Javascript方法保存信息。只要确保需要的时候添加了引用。就不用担心信息会丢失。
⑤ 在查询字符串(query string)中保存信息。
⑥ 在Url中保存信息。
3. 总结
① 状态管理是软件程序的重要组成部分。因为http的无状态天性,增加了web程序中的状态管理的难度。
ASP.NET MVC4中提供了多种方案供选择。
② session是保存状态最常用的一种方式。session可以被配置为保存在sqlserver或者独立的状态服务器上,还可以配置为将sessionid放到cookie中或者作为query string 的一部分。
③ query string 也是一个可以保存状态信息的地方。适用于安全性要求不高的,数据量较小的情况。
④ 也可以把状态信息完全保存在客户端。使用HTML5 Web Storage API。但是ASP.NET MVC4 对JQuery的支持要更好。
⑤ 扩展性也是影响状态保存方案的主要因素。