惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
C
CXSECURITY Database RSS Feed - CXSecurity.com
V
Visual Studio Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
小众软件
小众软件
L
LangChain Blog
Cyberwarzone
Cyberwarzone
美团技术团队
The Register - Security
The Register - Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
V
V2EX
Security Archives - TechRepublic
Security Archives - TechRepublic
Hacker News: Ask HN
Hacker News: Ask HN
L
LINUX DO - 最新话题
Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
aimingoo的专栏
aimingoo的专栏
人人都是产品经理
人人都是产品经理
F
Full Disclosure
V2EX - 技术
V2EX - 技术
The Cloudflare Blog
博客园 - 叶小钗
T
Threat Research - Cisco Blogs
阮一峰的网络日志
阮一峰的网络日志
G
GRAHAM CLULEY
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Latest news
Latest news
S
Security @ Cisco Blogs
Spread Privacy
Spread Privacy
Project Zero
Project Zero
K
Kaspersky official blog
MyScale Blog
MyScale Blog
Attack and Defense Labs
Attack and Defense Labs
云风的 BLOG
云风的 BLOG
博客园 - 【当耐特】
Hacker News - Newest:
Hacker News - Newest: "LLM"
大猫的无限游戏
大猫的无限游戏
P
Privacy International News Feed
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
C
Cybersecurity and Infrastructure Security Agency CISA
Webroot Blog
Webroot Blog
罗磊的独立博客
Vercel News
Vercel News
N
News and Events Feed by Topic
A
Arctic Wolf
C
CERT Recently Published Vulnerability Notes

博客园 - mapserver

MicroOrm.Net和现有ORM产品的对比 MicroOrm.Net(8) Table.Query() - Distinct、Skip & Take MicroOrm.Net(7) Table.Query() - Group By & Having MicroOrm.Net(6) Table.Query() - Join & Order By MicroOrm.Net(5) Table.Query() - Select MicroOrm.Net(4) Table.Query() - Where MicroOrm.Net(3) Database、Table、Column、Expression、Math&MathE MicroOrm.Net(2) 基础及动态特性 MicroOrm.Net(1) 总览 Asp.net服务器控件编程(6) ViewState(二)——ViewState用法和IStateManager Asp.net服务器控件编程(5) 复杂属性 Asp.net服务器控件编程(4) 呈现 Asp.net服务器控件编程(2) 来做个热身运动吧 Asp.net服务器控件编程(1) 开篇、基础 Asp.net服务器控件编程 总览 TextDataSource(3) — 请把我的数据更新回去 TextDataSource(2) — 翠花,上“数据” TextDataSource(1) — DataSourceControl内幕 .NET组件编程(10) 补充 ISupportInitialize
Asp.net服务器控件编程(3) ViewState(一)——asp.net控件的精华之一
mapserver · 2006-06-08 · via 博客园 - mapserver

        大家都知道Web应用程序的无状态,一个客户端的请求,在其请求完成后,服务器端都会删除这个请求的相关信息。有时我们需要Web请求完成后,还要继续保持信息,在传统的Web编程中最常用的有两种方式:Session、Cookies,但是这两种传统的方式,都有其弊端,Session会增加服务器的负担,Cookies则会依赖客户端,要求客户端必须支持Cookies,同时Cookies是存在客户端的计算机上,所以可能有安全问题。
        在Asp.net里ms提出了一种新的状态保持,这就是ViewState,当然原来的Session和Cookies在Asp.net可以继续使用,那我们用一个Web的请求来说明一下ViewState的一个工作流程(只关心ViewState),即使不写asp.net服务器控件,但我想了解一下页面的请求和回传对写asp.net的程序还是很有好处的。

        客户端向服务端请求一个新的aspx页面:
        1、 服务器端会创建一个控件树,再创建页面上的所有控件,把控件加到控件树中。
        2、 TrackViewState状态跟踪,检查控件的EnableViewState属性,对EnableViewState=ture的控件进行跟踪。
        3、 触发页面OnLoad。
        4、 预生成OnPreRender。
        5、 检查控件的EnableViewState属性,对需要保存状态的调用SaveViewState[状态1]。
        6、 Render生成。
        7、 … …

        从客户端回传一个aspx页面,页面被Post回服务端后。
        A、 和上述1一样。
        B、 和上述2一样。
        C、 LoadViewState,加载控件提交前的状态[就是加载状态1]。
        D、 LoadPostdata,从Post回来的表单中取出相应的数据,并把这些数据更新控件的状态[状态2]。
        E、 和上述3一样。
        F、 触发修改事件和回传事件。
        G、 和上述4一样。
        H、 保存状态SaveViewState[状态2]。
        I、 Render。
        J、 … …

        上面就是ViewState的工作的一个流程,其实也就是aspx的生命周期,虽然我们在5和H对ViewState进行保存,在C进行了ViewState的装载,那又究竟是怎样保存和装载的呢?这就是ViewState的串行化和并行化的,在5和H对ViewState进行串行化,把这些状态序列化为一个字符串(如value="/wEPDwULLTE3NjgxMzM0MDIPZBYCZg9kFgICBg9kFgICAQ9kFhACAQ8PFgQeC05hdmlnYXRlVXJsBRdodHRwOi8vd3d3LmNuYmxvZ3MuY29tLx4EVGV4dAUJ5Y2a5a6i5ZutZGQCAw8PFgIfAAUdaHR0cDovL21hcHNlcnZlci5jbmJsb2dzLmNvbS9kZAIHDw8WBh4GVGFyZ2V0ZR8ABR1odHRwOi8vbWFwc2VydmVyLmNuYmxvZ3MuY29tLx8BBQltYXBzZXJ2ZXJkZAIJDw8WBB8ABRdodHRwOi8vd3d3LmNuYmxvZ3MuY29tLx4ISW1hZ2VVcmwFFn4vSW1hZ2VzL2FkbWlubG9nby5naWZkZAINDxYCHgdWaXNpYmxlZ2QCHQ9kFgICAQ9kFgQCAg8PFgIeC0N")发送到客户端,当页面再被Post回服务端的时候,在C又对这个字符串进行并行化,把它们反序列化为对象状态。aspx页面有串行化和并行化的过程,同时这两个过程的代价又是比较高昂的,所有我的原则是尽可能少的保存控件的ViewState。那什么样的对象可以被保存在ViewState中呢?原则上来讲,可以被序列化的对象都可以被保存在ViewState中,但是在asp.net中ViewState对Array、ArrayList和HashTable进行了优化。
        在aspx页面的请求和回传过程中ViewState都是以明文形式传送,很容易被他人截取,对特别重要的信息可以考虑加密或者用Session等方式来保存,但这不是控件开发者的负责的,而应该是由页面开发者来完成。
        最后:为什么我们需要回传的一个aspx页面都必须有一个运行Runat=”Server”的Form的,上述的D中我们看出,我们需要这个Form来回传控件的更新数据。同时我们也可以看到所有的ViewState的处理都是服务端进行的,与客户端没有任何的关系,所有不管你是ie的客户端还是firefox的客户端,都可以访问发布的asp.net站点。
        如果在本文中发现有什么不妥的地方,请朋友们给与指点,小弟在此先谢过。