[转载]SQL Server性能调校系列(7)--RAID - 我爱菊花 - 博客园

mikel阅读(981)

[转载]SQL Server性能调校系列(7)–RAID – 我爱菊花 – 博客园.

一: RAID简介

RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)是一项数据保护策略.

 

二: RAID的几种常用级别

 

1. RAID 0:

通过并行读取来提高数据I/O, 读取操作效率很高, 但是不提供数据容错及保护. 不推荐作为SQL Server使用.

image

 

2. RAID 1:

镜像保护,有两个驱动器,一个做主驱动器,一个做镜像, 所以是实际需要两倍的驱动器,第二个所为冗余使用. 使用RAID 1我们的存储容量应该是(n*s/2)。

一次写操作写入到两个磁盘, 所以虽写入速度会稍微有影响, 但是读取速度几乎是大多数情况下的两倍. 因为在读取操作过程中驱动器可以并行地进行访问,从而提高了吞吐量。RAID 1限制于两个驱动器。

image

 

3. RAID 5:

带校验的磁盘条带。在这种类型的RAID中,数据以复杂条带的形式写入到阵列中的所有驱动器中,同时所有驱动器中都有分布数校验块。这样RAID 5就可能使用三个或者更多磁盘组成的任意大小的阵列,只牺牲相当于一个磁盘的存储容量用于校验。但是这种校验是分布式的,并不单独存在于任何一个物理磁盘 中.

RAID 5由于在大型阵列中牺牲的存储容量较少,所以它具有成本效益的特点,从而被人们所广泛使用。与镜像不同的是,带有校验的条带要求必须在磁盘之间进行针对每 个写入条带的计算,这造成了一部分的开销。因此,吞吐量并不总是一个容易计算的项目,它在很大程度上取决于系统在做校验计算时候的计算能力。

计算RAID 5的容量非常简单:就是((n-1)*s)。RAID 5阵列可以避免这列中任何单个磁盘的丢失.

 

对RAID5的每一次写操作, 都会涉及到多个读用于计算并且存储. 对SQL Server有很多的写操作,并且要求很高效率的时, RAID 5并不是一个很好的选择.

image

 

4. RAID 6

带双重校验的磁盘条带。RAID 6与RAID 5非常相似,但它的每个条带使用两个校验块,而不是一个,这加强了应对磁盘故障的保护能力。

RAID 6是RAID家族中的新成员。RAID 6是其他几个RAID类型实现标准化几年之后增加的。RAID 6比较特殊,因为它可以承受阵列中任意两个驱动器的故障,同时防止数据丢失。但是为了配合额外的冗余度,RAID 6阵列需要牺牲阵列中相当于两个驱动器的容量,并要求真列中最少有四个驱动器。RAID 6的容量可以用((n-2)*s)来计算。

 

5. RAID 10:

带条带的镜像。从技术上来说,RAID 10是一种混合的RAID,包括存在于一个非校验条带(RAID 0)中的一对RAID镜像。

当一个阵列中只有两个驱动器的时候,很多厂商会称其为RAID 10(或者RAID 10+),但从技术上来说这应该是RAID 1,因为阵列中至少有四个驱动器才会发生条带化。对于RAID 10来说,驱动器必须是一对一对添加的,因此阵列中的驱动器数量只可能是偶数。

RAID 10可以在丢失近半数驱动器组的情况下正常运转,同时最多只能承受每个驱动器中一个驱动器发生故障或者丢失。RAID 10不包含校验计算,这使得它相对RAID 5和RAID 6来说具有一定的性能优势,而且阵列对计算能力的要求也更低。RAID 10提供了超过任何一种常见类型RAID的读取性能,因为在读取操作中阵列中的所有驱动器都可同时使用。但是RAID 10的写入性能要低很多。RAID 10的容量计算方法和RAID 1相同,都是(n*s/2)。

image

 

RAID性能比较:

image

 

读效率: 因为是并行读取, 读取效率都很高.

写效率: RAID 0 > RAID 1 > RAID 10 > RAID 5

磁盘利用率: RAID 0 > RAID 5 > RAID 1 = RAID 10

容错能力:  RAID 10 = RAID 1 > RAID 5 > RAID 0

作为SQL Server 的DB Server建议使用RAID 1 或RAID10.

 

 

三: RAID与SQL Server

 

DB server physical disk design with separate RAID volumes for data, log, tempdb and backup files.

磁盘架构:

C:  OS [要求很好的数据读写效率, 并且有很强的容错能力, 提供数据保护]

D: 做RAID10, 存储DB数据文件 [要求读的效率高, 写效率比较低一些, 容错能力要强,如果数据文件很大, 要求节约磁盘空间]

E: 做RAID1,  存储DB日志文件 [在DB运行过程中, 日志读写比较频繁, 需要很高的数据读写效率]

F: 做RAID10, 存储数据库的tempdb [存放临时数据库]

G(可选): 做RAID1, 数据备份,建议数据备份在远端

image

 

SSD硬盘:SSD的英文全称是Solid State Disk/Drive, 中文翻译为固态硬盘. 可以广泛应用于服务器、台式机、笔记本、移动设备、游戏机等, 加速启动, 提高性能, 同时降低功耗.

优点:

  • 速度快(高I/O).
  • 耐用防震
  • 无噪音
  • 重量轻
  • SQL Server搭配SSD硬盘可以取得很好的I/O性能

缺点:

  • 价格高,容量小,做RAID会进一步损失容量, 所以性价比不高. 对于不考虑价格的公司就另当别论.
  • 技术还不是太成熟

 

四: 总结

针对不同的功能,建立不同的RAID架构可以提高数据效率和利用率.

 

(以上只是自己对RAID的一点浅显的理解,如有错误或者不当的地方,欢迎提出指正. 谢谢!)


>>>SQL Server性能调校系列入口地址

—————————————————– 本人博客地址:http://www.cnblogs.com/changbluesky 请多多支持,谢谢!———

[转载]SQL Server性能调教系列(6)—Index Structure and Tuning - 我爱菊花 - 博客园

mikel阅读(915)

[转载]SQL Server性能调教系列(6)—Index Structure and Tuning – 我爱菊花 – 博客园.

一:前言

Index对数据库性能有着举足轻重的作用。Index设计的优劣直接影响到DB执行的效率。所以在做DB Tuning时,一部分会从Index着手处理,SQL Server也提供了很好的工具Database Engine Tuning Advisor,会给出一些建Index和优化方面的建议。

 

二:Index概述

这方面在各个博客论坛上面已经讲的比较多了,在此大致总结一下:

1. 数据表的基本结构

当建立一个新表时,系统将在磁盘中分配一段以8K为单位的连续空间;当第一个8K用完的时候,SQL Server指针会自动分配8K的空间。每个8K空间成为一个数据页(Page),又称页面或者数据页面,并分配0-7的页号,每个文件的第0页记录引导 信息,叫文件头(File Header);每8个数据页(64K)的组合形成扩展区(Extent),成为扩展。全部的数据页的组合形成堆(Heap)。

 

2. 索引的基本概念

建立索引的目的就是提高数据检索效率,改善数据库工作性能,提高数据访问速度。系统表sysindexes存储Index的重要信息。以B-Tree为存储结构。

 

3. 数据表扫描与索引的使用

没有索引时,访问表的数据时按照Table Scan,平均效率比较低。

建立索引时,访问表的数据时按照Index Scan/Seek,平均效率很高。

image

 

4. 聚集索引和非聚集索引(Clustered Index and Non Clustered Index)

相同点:

  • 以B-Tree为存储结构存放的一组数据页
  • 不同阶的节点包含指向另一个阶的数据页
  • 子节点包含所有的键值
  • 在sysindexes中可以找到索引的大小和内容分布
  • 都会提高数据查询的效率

不同点:

  • 叶子节点存放什么:聚集索引存放实际的数据页;非聚集索引存放指针

image

注意:子叶层级存放的内容不一样。

 

5. 覆盖索引(Covering Index)

索引覆盖是指建索引的字段正好是覆盖查询条件中所涉及的字段,这里需要注意的是,必须是从第一个开始覆盖。

 

6. 死锁(DackLock)

请参照

http://www.cnblogs.com/changbluesky/archive/2010/06/10/1753021.html

 

三:性能简述(Performance)

1. Index碎片

1.1 查询碎片

sys.dm_db_index_physical_stats可以用来检测特定索引、表或索引视图的所有索引、数据库中所有索引或所有数据库中所有索引中的碎片。

捕获2

重要栏位:

avg_fragmentation_in_percent 逻辑碎片(索引中的无序页)的百分比
fragment_count 索引中的碎片(物理上连续的叶页)数量
avg_fragment_size_in_pages 索引中一个碎片的平均页数

 

1.2. 重建索引与重组索引(rebuild and reorganize)

无论何时对基础数据执行插入、更新或删除操作,SQL Server 数据库引擎都会自动维护索引。随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片)。当索引包含的页中的逻辑排序(基于键值)与数 据文件中的物理排序不匹配时,就存在碎片。碎片非常多的索引可能会降低查询性能,导致应用程序响应缓慢。通过重新组织索引或重新生成索引来修复索引碎片, 提高性能。

  • ALTER INDEX IX_IndexName ON dbo.TableName REBUILD WITH (ONLINE=ON)
  • ALTER INDEX IX_IndexName ON dbo.TableName REORGANIZE

 

两种方法的区别:

  • 重新组织索引是通过对叶页进行物理重新排序,使其与叶节点的逻辑顺序(从左到右)相匹配,从而对表或视图的聚集索引和非聚集索引的叶级别进行碎片整理。
  • 重新生成索引将删除该索引并创建一个新索引。此过程中将删除碎片,通过使用指定的或现有的填充因子设置压缩页来回收磁盘空间,并在连续页中对索引行重新排序(根据需要分配新页)。这样可以减少获取所请求数据所需的页读取数,从而提高磁盘性能。

 

建议根据碎片程度,使用修复碎片的最佳方法:

image

 

2. 选择正确而的Index

2.1 主要的考量

以范围查询

常常需要排序的数据

2.2 次要考量

栏位长度要短

  • 会影响所有的非聚集索引
  • 非聚集索引的子也曾都包含所有聚集索引的键值

数据的类型

 

3.建立索引的方针

所有SQL语法的优先性

优先建立多个查询语法可以共通使用的索引

建立符合索引时,最佳的栏位顺序

 

四:总结

 

与书中的索引一样,数据库中的索引使您可以快速找到表或索引视图中的特定信息。索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存 储位置的指针。通过创建设计良好的索引以支持查询,可以显著提高数据库查询和应用程序的性能。索引可以减少为返回查询结果集而必须读取的数据量。索引还可 以强制表中的行具有唯一性,从而确保表数据的数据完整性。

设计良好的索引可以减少磁盘 I/O 操作,并且消耗的系统资源也较少,查询优化器也能够很好的利用索引,提高查询性能。

 

>>>SQL Server性能调校系列入口地址

—————————————————– 本人博客地址:http://www.cnblogs.com/changbluesky 请多多支持,谢谢!———

[转载]企业级应用架构(NHibernater+Spring.Net+MVC3)_1.0 - 月光冷锋 - 博客园

mikel阅读(957)

[转载]企业级应用架构(NHibernater+Spring.Net+MVC3)_1.0 – 月光冷锋 – 博客园.

        本人已经从事公司两套这类架构系统的开发工作啦!对于这套架构,我惊叹不已!BPS和CMS系统都是采用这套架构。但本人也同时渐渐发现了这套架构有诸多 不足之处,于是本人利用闲暇时光进一步改进了这套架构。新架构是基于“领域模型”的企业级应用架构模式,使用了 NHibernater+Spring.Net+MVC3的框架技术搭建。即便的是1.0版本,我也惊叹其几乎趋于完美了!这套架构是马丁.福勒关于“企 业级应用架构模式”理论的.Net实践。

架构基于三层模型,使用了接口技术、工厂模式、MVC模式、适配器模式等设计技巧,使架构支持高度扩展、易于修改、易于维护等诸多优点。

主要特性如下 :

1、三层结构

2、使用接口。降低依赖

3、改变了老架构部分类库职责不清。现在各类库职责清晰

4、改变了老架构,高度依赖外部组件的设计。现在基于“适配器模式”设计使用第三方组件,如:Log4.net

5、支持CodeSmith模版生成Hibernate领域类、配置文件等。

6、在老架构的基础上改进了业务层和数据层的依赖,使其彻底分离。

7、MVC层的Model分离。

8、增加了Facade类库作为表现层和业务层的隔离层。

重用代码:

EnterpriseArchitecture-1.0

NHibernater代码生成模版:

NHibernate

北风数据库:

SQL Server 2000 Sample Databases

所需环境:

VS2010、MVC3、.NetFramework4.0、Window XP以上、SQLServer NorthWind数据库

注意:因为我没有时间去写个什么文档,所以提供以下有助于理解的若干设计图:

 

[转载]如何成为一名软件架构师?_IT新闻_博客园

mikel阅读(1106)

转载如何成为一名软件架构师?_IT新闻_博客园.

  所谓“不想当架构师的程序员不是一个好的程序员”,那么如何进入软件架构师行列呢?软件架构师 Daniel Mohl 给出了他的建议

下面这个列表是一个很好的起点,帮助你通向软件架构师之路:

  • 每一到两年学习一门新的编程语言。
  • 选择一个重点领域,尽可能对技术有一个高层次的理解。
  • 针对你的重点领域,开始写博客,并继续扩大你的知识面,在你的重点领域中成为专家。
  • 尝试不同的技术、编程语言、设计模式、架构等。
  • 向你的听众介绍技术,并努力让每个听众都能理解。
  • 阅读博客,浏览并参与到 Twitter 和 Google+ 中,收听播客、看杂志、参加用户组会议和技术会议,并在这些会议上发言。
  • 每天安排时间学习新的东西,即使它只需 15 分钟。
  • 有效利用一些被浪费掉的时间。
  • 了解各种可用的工具,以帮助你更有效地做好本职工作。
  • 了解大量不同项目中的不同架构。
  • 了解不同的项目管理方法。
  • 你所用的技术可以提供给业务多少价值?了解评估的方法。

原文:How to Become a Software Architect

[转载]自动化生产安卓(Android)应用程序 - Jalen Wang - 博客园

mikel阅读(870)

[转载]自动化生产安卓应用程序 – Jalen Wang – 博客园.

自动化生产安卓应用程序

 在The Joel Test: 12 Steps to Better Code的第二个Step就是“Can you make a build in one step?”。从自己负责Inventor Publisher Mobile Viewer以来,一直就想把生成 APK的过程给自动化,因为通过Eclipse + ADT的做release的APK实在太繁琐,而且需要经常 做APK给QA测试。一直忙着做feature,今天得空,在网上搜索了一下,还真被我找到了,方 案如下:

Step1:下载安装Ant

这个直接follow ant官方网站的安装说明就可以了。

Step2:生成build.xml

Android project的根目录(有manifest的那个文件夹),运行下面这个命令:

android update project --path .

到此,运行

ant debug

已经可以生成Debug build。但是native的code还是没有参与build的过程。

Step3:添加native code的支持

在根目录下添加customrules.xml,并添加如下语句:

<project>
<target name="-pre-build">
    <exec executable="${ndk.dir}/ndk-build" failonerror="true"/>
</target>

<target name="clean" depends="android_rules.clean">
    <exec executable="${ndk.dir}/ndk-build" failonerror="true">
        <arg value="clean"/>
    </exec>
</target>
</project>

并且在local.properies指定ndk的位置,类似sdk.dir:

ndk.dir=/home/wangjiay/software/android-ndk-r8b

至此,我们已经可以自动build native code了。但是还是不能生产release build,因为我 们没有指定key store。

Step4:指定key store,支持release build

这个其实比较简单了,只要在local.properies中指定key store的一下设置就可以了:

key.store=<PathOfYourKeyStore>
key.alias=<...>
key.store.password=<...>
key.alias.password=<...>

就说到这里了,详情请移步这里或者联系我。


Post by: Jalen Wang (转载请注明出处)

[转载]大型网站数据库离自动化运维还有多远?Sqler 工具帮你解决(更新部分监控) - 徐郞顾 - 博客园

mikel阅读(890)

[转载]大型网站数据库离自动化运维还有多远?Sqler 工具帮你解决(更新部分监控) – 徐郞顾 – 博客园.

SQLer 工具介绍

用MSSQL做大型网站,基本上会牵涉到群集、复制、消息队列 、镜像、日志传送 、always On.

SQLer 作者有 多年 大型 网站 一线 DBA工作 经验,深刻理解自动化运维、自动化工具重要型 。

自动化 工具必须 满足精细化管理,准确无误的定位到问题点。DBA工作本身是未雨绸缪,要走在前面,走的快,还不累趴下,自动化工具必须到位。

sqler 工具介绍(监控篇)

sqler 工具介绍

 

数据库字符集 报警

需要重启的 sql服务器 默认阀值是90

数据库增加设置报警

数据库所有者报警

数据库日志报警

Repliaction Error 报警

根据 邮件提示信息查看 error sql

 

 

练一技,修百艺,而成于自然.

[转载].NET性能调优之三:YSlow相关规则的调优工具和方法 - Parry - 博客园

mikel阅读(864)

[转载].NET性能调优之三:YSlow相关规则的调优工具和方法 – Parry – 博客园.

.NET性能调优系列文章

系列文章索引

1.YSlow简介

在这篇文章里来谈谈web前端的相关优化,主要遵从YSlow规则,具体的规则意义在YSlow的23条规则描述里已经描述的很清楚,不再赘述,那么这里主要来探讨下如何针对部分规则进行相关调优。

雅虎的Exceptional Performance Team整理出了针对web页面进行性能改善的34条规则,而YSlow从里面提取出来了23条规则来指导开发者进行web页面优化,常被称为23条军规,具有很强的指导意义。要知道,第一个开始做门户类web网站并且当年做的风生水起的就是雅虎。

运行相关的YSlow插件对需要分析的网站分析后,插件会给出这个网站的整体评分和23条规则的详细评分,以供开发者逐条优化,评分从A-F,分值越低(A最低F最高),说明与规则越贴合。

2.YSlow的使用

下面这张图是YSlow提供的插件,按照自己的需要下载安装即可。

以Chrome为例,打开需要分析的网站,安装后点击插件工具栏的YSlow图标运行分析后即可看到分析结果。

下面列出了YSlow的23条规则。

这里暂且不去探讨如CDN等服务器部署架构方面的内容,只从代码实现优化的角度去讨论这些规则。

  1. Minimize HTTP Requests
  2. Use a Content Delivery Network
  3. Avoid empty src or href
  4. Add an Expires or a Cache-Control Header
  5. Gzip Components
  6. Put StyleSheets at the Top
  7. Put Scripts at the Bottom
  8. Avoid CSS Expressions
  9. Make JavaScript and CSS External
  10. Reduce DNS Lookups
  11. Minify JavaScript and CSS
  12. Avoid Redirects
  13. Remove Duplicate Scripts
  14. Configure ETags
  15. Make AJAX Cacheable
  16. Use GET for AJAX Requests
  17. Reduce the Number of DOM Elements
  18. No 404s
  19. Reduce Cookie Size
  20. Use Cookie-Free Domains for Components
  21. Avoid Filters
  22. Do Not Scale Images in HTML
  23. Make favicon.ico Small and Cacheable

3.如何减少HTTP请求和CSS Sprite工具

减少HTTP请求的目的可以去查看规则的详细解释,或者使用Chrome里面开发者插件的Network功能请求一个网站后查看资源请求的Timeline你就应该能明白了,这里就不再赘述。

实现减少HTTP请求方面,资源文件方面能做的就是合并操作了,包括CSS、JavaScript的合并,当然还包含图片的合并。

关于CSS、JavaScript的合并可以参见我之前的文章:[前端优化]使用Combres合并对js、css文件的请求

而图片的合并最常用的方法就是CSS Sprite技术了,具体的原理解释见这里

这是网易首页使用CSS Sprite技术合并后的图片。

网站如果在前期就使用CSS Sprite技术对图片进行了合并,开发起来还是挺方便的,而如果是开发好后再来整理零散的图片就会很麻烦,需要对齐图片像素、调整相关CSS样式等。

还好有工具可以帮我们完成这样的工作,这里介绍一个在线生成CSS Sprite的工具:CSS Sprite Generator

将需要合并的图片压缩成一个zip包上传,并配置相关的选项。

点击生成按钮后,即可生成对应的CSS和合并后的图片,红线标注的部分就是CSS Sprite技术的精髓:通过图片的偏移实现显示合并的图片上不同位置的小图片。

很简单对吗?为什么还不动动手将你网站零散的图片进行合并来降低网站对服务器的HTTP的请求呢?

4.GZIP压缩和资源文件压缩

GZIP压缩有时能达到80%左右的压缩率,如果可以开启(有些虚拟主机没有权限开启)就尽量开启吧。

关于GZIP的详细设置、压缩比较等内容可以参见我之前的文章:IIS开启GZIP压缩效率对比及部署方法

而关于CSS、JavaScript资源的压缩可以参见我之前的文章:[前端优化]使用Microsoft Ajax Minifier对资源文件进行压缩优化

当然有很多方法、框架可以实现这类的功能,可以在了解了原理后自行搜索相关文章。

5.CSS、JavaScript资源文件相关

  • 尽量不要使用CSS表达式,如background-color: expression((new Date()).getHours()%2?”#B8D4FF”:”#F08A00″) 这样的内容,因为会带来诸多的浏览器性能问题。
  • 不要有重复的脚本内容。
  • AJAX使用缓存并尽量使用get进行请求。

6.图片相关

  • 不要将src、href的属性设置为空。
  • 不要强制去缩放图片,如这样的标签<img width=”100″ height=”100″ src=”mycat.jpg” alt=”My Cat” /> 中的图片,就不要使用宽高大于100px的图片,不然会带来如加载缓慢、图片模糊等问题。
  • 不要使用太大的favicon.ico,推荐是1K以下并设置缓存。

7.结语

YSlow的23条规则基本包含了web前端优化的众多细节,优化时各个规则突破,如果网站跑分等级能在C以上,最起码从前端性能和SEO方面来说就很不错了。

了解这23条优化规则也能在开发的过程中引导着你处理和决策问题的方法,所以还是很有益处的。

文章有所疏漏和要补充的,请留言一起讨论,也请关注后续的相关文章。

如果文章对你有点帮助,推荐一下吧,谢谢 🙂

[转载]ASP.NET 框架 之 HttpModule - willpower - 博客园

mikel阅读(987)

[转载]ASP.NET 框架 之 HttpModule – willpower – 博客园.

HttpModule是如何工作的

当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求的“必经之路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。

示例1

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

namespace MyHttpModule

{

     /// <summary>

     /// 说明:用来实现自己的HttpModule类。

     /// 作者:文野

     /// 联系:stwyhm@cnblogs.com

     /// </summary>

     public class MyFirstHttpModule : IHttpModule

     {

         private void Application_BeginRequest(object sender, EventArgs e)

         {

              HttpApplication application = (HttpApplication)sender;

              HttpContext context = application.Context;

              HttpRequest request = application.Request;

              HttpResponse response = application.Response;

              response.Write(我来自自定义HttpModule中的BeginRequest<br />”);

         }

         private void Application_EndRequest(object sender, EventArgs e)

         {

              HttpApplication application = (HttpApplication)sender;

              HttpContext context = application.Context;

              HttpRequest request = application.Request;

              HttpResponse response = application.Response;

              response.Write(我来自自定义HttpModule中的EndRequest<br />”);

         }

         #region IHttpModule 成员

         public void Dispose()

         {}

         public void Init(HttpApplication application)

         {

              application.BeginRequest += new EventHandler(Application_BeginRequest);

              application.EndRequest += new EventHandler(Application_EndRequest);

         }

         #endregion

     }

}

Web.config进行如下配置

<add name=MyFirstHttpModuletype=MyHttpModule.MyFirstHttpModule,MyHttpModule/>

 


深入了解
HttpModule

一个HTTP请求在HttpModule容器的传递过程中,会在某一时刻(ResolveRequestCache事件)将这个HTTP请求传递给HttpHandler容器。在这个事件之后,HttpModule容器会建立一个HttpHandler的入口实例,但是此时并没有将HTTP请求控制权交出,而是继续触发AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute事件之后,HttpModule窗口就会将控制权暂时交给HttpHandler容器,以便进行真正的HTTP请求处理工作。

而在HttpHandler容器内部会执行ProcessRequest方法来处理HTTP请求。在容器HttpHandler处理完毕整个HTTP请求之后,会将控制权交还给HttpModuleHttpModule则会继续对处理完毕的HTTP请求信息流进行层层的转交动作,直到返回到客户端为止。

 


1HttpModule生命周期示意图

 

示例2:验证HttpModule生命周期

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

namespace MyHttpModule

{

    public class ValidaterHttpModule : IHttpModule

    {

        #region IHttpModule 成员

        public void Dispose()

        {}

        public void Init(HttpApplication application)

        {

            application.BeginRequest += new EventHandler(application_BeginRequest);

            application.EndRequest += new EventHandler(application_EndRequest);

            application.PreRequestHandlerExecute += new EventHandler(application_PreRequestHandlerExecute);

            application.PostRequestHandlerExecute += new EventHandler(application_PostRequestHandlerExecute);

            application.ReleaseRequestState += new EventHandler(application_ReleaseRequestState);

            application.AcquireRequestState += new EventHandler(application_AcquireRequestState);

            application.AuthenticateRequest += new EventHandler(application_AuthenticateRequest);

            application.AuthorizeRequest += new EventHandler(application_AuthorizeRequest);

            application.ResolveRequestCache += new EventHandler(application_ResolveRequestCache);

            application.PreSendRequestHeaders += new EventHandler(application_PreSendRequestHeaders);

            application.PreSendRequestContent += new EventHandler(application_PreSendRequestContent);

        }

        void application_PreSendRequestContent(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

           application.Context.Response.Write(“application_PreSendRequestContent<br/>”);

        }

        void application_PreSendRequestHeaders(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Context.Response.Write(“application_PreSendRequestHeaders<br/>”);

        }

        void application_ResolveRequestCache(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Context.Response.Write(“application_ResolveRequestCache<br/>”);

        }

        void application_AuthorizeRequest(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Context.Response.Write(“application_AuthorizeRequest<br/>”);

        }

        void application_AuthenticateRequest(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Context.Response.Write(“application_AuthenticateRequest<br/>”);

        }

        void application_AcquireRequestState(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Context.Response.Write(“application_AcquireRequestState<br/>”);

        }

        void application_ReleaseRequestState(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Context.Response.Write(“application_ReleaseRequestState<br/>”);

        }

        void application_PostRequestHandlerExecute(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Context.Response.Write(“application_PostRequestHandlerExecute<br/>”);

        }

        void application_PreRequestHandlerExecute(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Context.Response.Write(“application_PreRequestHandlerExecute<br/>”);

        }

        void application_EndRequest(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Context.Response.Write(“application_EndRequest<br/>”);

        }

        void application_BeginRequest(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.Context.Response.Write(“application_BeginRequest<br/>”);

        }

       

        #endregion

    }

}

 


多个自定义的Http Module的运作

从运行结果可以看到,在web.config文件中引入自定义HttpModule的顺序就决定了多个自定义HttpModule在处理一个HTTP请求的接管顺序。注:系统默认那几个HttpModule是最先衩ASP.NET Framework所加载上去的。

示例3:(代码类同示例2

 



HttpModule中终止此次的HTTP请求

可以利用HttpModule通过调用HttpApplication.CompleteRequest()方法实现当满足某一个条件时终止此次的HTTP请求。

需要注意的是,即使调用了HttpApplication.CompleteRequest()方法终止了一个HTTP请求,ASP.NET Framework仍然会触发HttpApplication后面的这3个事件:EndRequest事件、PreSendRequestHeaders事件、PreSendRequestContent事件。

如果存在多个自定义的HttpModule的话,当Module1终止了一个HTTP请求,这个HTTP请求将不会再触发Module2中相应的事件了,但Module2的最后三个事件仍会被触发。

示例4

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

namespace MyHttpModule

{

    public class CompleteRequestHttpModule : IHttpModule

    {

        #region IHttpModule 成员

        public void Dispose()

        {}

        public void Init(HttpApplication application)

        {

            application.BeginRequest += new EventHandler(Application_BeginRequest);

        }

        void Application_BeginRequest(object sender, EventArgs e)

        {

            HttpApplication application = (HttpApplication)sender;

            application.CompleteRequest();

            application.Context.Response.Write(请求被终止。”);

        }

        #endregion

    }

}

 


参考资料

ASP.NET深入解析》

ASP.NET实用全书》

[转载]jQuery插件ColorBox

mikel阅读(1200)

[转载]jQuery插件ColorBox.

 

官方网站http://colorpowered.com/colorbox/

 

  • 支持 照片,照片组,幻灯片,ajax,内联 和 iframe 框架。
  • 通过CSS 控制外观,使用用户可以很容易重新定制外观。
  • 不需要更改 ColorBox 的 JavaScript 文件就可以重新设定其行为。
  • 可以依靠 callback & event-hooks 进行拓展,不需要修改源代码。
  • 非常友好,不需要修改现有的 HTML,所有的选项都通过 JS 设置。 

    介绍

    colorbox()函数使用一堆key/value对象和一个可选的callback函数

    格式:$(‘selector’).colorbox({key:value}, callback);

    例子: $(‘a.gallery’).colorbox({transition:’fade’, speed:500});

    还是例子:$(‘button’).colorbox({href:”thankyou.html”});

     

     

    设置的值

     

    默认值

     

    介绍

    transition “elastic” 过渡效果,可以是”elastic”, “fade”, or “none”.
    speed 350 设置过渡效果的持续时间,毫秒
    href false Example:$(‘h1’).colorbox({href:”welcome.html”})

    这个用来设置一个锚标记的值或者一个不是锚的元素,例如图像或者表单的按钮,例如:

    title false 这可以为Colorbox设置一个标题
    rel false Example:$(‘#example a’).colorbox({rel:’group1′})

    这个可以根据元素的rel属性设置要显示的元素集合,也可以覆盖一个存在的rel属性

    width false Example: “100%”, “500px”, or 500

    设置宽度,包括边框和按钮

    height false Example: “100%”, “500px”, or 500

    设置高度,包括边框和按钮

    innerWidth false Example: “50%”, “500px”, or 500

    这个可以设定一个固定的内大小,包括边框和按钮

    innerHeight false Example: “50%”, “500px”, or 500

    这个可以设定一个固定的内高度,包括边框和按钮

    initialWidth 300 设置初始化宽度
    initialHeight 100 设置初始化高度
    maxWidth false Example: “100%”, 500, “500px”

    设置内容的最大宽度

    maxHeight false Example: “100%”, 500, “500px”

    设置内容的最大高度

    scalePhotos true 如果是true且maxWidth, maxHeight, innerWidth, innerHeight, width, 或者 height 被设置,

    Colorbox会缩放图片以使用边框

    scrolling true 如果是false,Colorbox不会为了溢出元素设置滚动条
    iframe false 如果是true,元素会在Iframe中显示
    inline false Example: $(“#inline”).colorbox({inline:true, href:”#myForm”});

    如果是true,JQuery选择器可以用来选择要显示的元素。例如:

    html false Example:
    $.fn.colorbox({html:’

    这个是直接让你显示HTML代码,例

     

    Hello

    ‘});

    photo false 如果为true,ColorBox只会把元素按照图片显示,防止类似photo.php?pic=1这样的连接被误认为是网页
    opacity 0.85 遮罩层不透明度 从0-1之间取值
    open false 如果为true,ColorBox会自动开启
    preloading true 如果为True,ColorBox会自动预载要显示图片
    overlayClose true 为true单击遮罩层就可以把ColorBox关闭
    slideshow false 为True,会自动滚动图片
    slideshowSpeed 2500 设置时间,毫秒
    slideshowAuto true 为tuue,滑动会自动开始
    slideshowStart “start slideshow” 开始自动滑动按钮的文本
    slideshowStop “stop slideshow” 停止自动滑动按钮的文本
    current “{current} of {total}” 文本内容:现在正在显示的元素序号
    previous “previous” “上一个”按钮的文本
    next “next” “下一个”按钮的文本
    close “close” “关闭”按钮的文本

[转载]ASP.NET Mvc 3 中的分部视图 - baidixing - 博客园

mikel阅读(989)

[转载]Mvc 3 中的分部视图 – baidixing – 博客园.

   说到ASP.NET MVC,我相信很多开发者都会和我一样,赞扬一番,把我们开发者的开发速度又可以提高,并且可以随意的控制生成的html,这应该是Mvc时代如果到来的 话,最可能使它成功的原因了。但是赞扬归赞扬,既然他是一种开发模式,我们必须要学习,而且要好好学习。

元旦几天假让我放松了一下,今天正式回归正常,开始我的技术之旅。今天探讨一下Mvc中的分部视图。

提到分部视图,我相信大家会想到和web form时代的对应物ascx分部控件,我们在Mvc时代可以更加轻松的控制分部视图。

要说明分部视图,我们先来讨论一下分部视图可以带给我们的优点:

  1. 分部视图可以使系统插件化 。我现在非常推崇一个原则,就是可以分离的东西绝对不要让他们在一起,因为只有每个功能模块都是单独的,我们才可以在其他位置重用它。
  2. 分部视图还可以带来一个优点,就是分工合作。 现在是一个合作的时代,没有任何一个人可以单独完成规定的任务而不与别人合作,除非是牛人例外。分部视图可以带给我们开发不同模块中的分工合作。
  3. 分部视图还有一个在Mvc时代的优点,就是实现简单。我自从学习使用Mvc以后,我基本上就很少写web form的代码了,因为我感觉没有Mvc书写的那么流畅。html.partial(partialName)就可以显示一个分部视图的页面。

简单的叙述了一下优点,既然我们能发现优点存在,那么我们就想在实际项目中更好的使用它,毕竟程序员都追求懒,一段代码,三句可以搞定,绝对不会写三句半,当然最小化原则也是我们代码优化的最终目的。

那么究竟在Mvc中有哪些可以实现分部视图的功能呢?以及我们要注意点什么呢?

  • Html.Partial(partialName)和html.RenderPartial(partialName) 就是首选。 其实这两个方法我们可以指定任何的.cshtml文件,不一定只是分

    部视图。大家来回忆一下分部视图和视图的区别在哪里?就是视图有head、body标签,可以定义js,可以指定母板页,但是在我们用Vs右键添加

    分部视图的时候,我们会看到只是一些基本的html标签,没有任何的head、body,但是这不等于我们不可以添加,所以说partialName可以是任

    何的视图文件。但是我们最好是创建分部视图,因为我们最终是要把这些分部视图合并成为一个页面,如果只是分部视图的html标签,那么在整

    体页面中html标签就会显得很干净。

    另外,我们不要在分部视图中定义或者引用css以及js。如果需要我们在整体页面中定义或引用。原因有2:1是我们的分部视图文件和整体页面的

    路径可能不在同一个目录下,那么会造成找不到css或js文件的情况。2就是对整体页面的html代码是一种伤害。

  • html.Action和html.RenderAction()方法也可以用来作为分部视图使用

具体使用方式我想就不需要细说了,大家对htmlHelper都会非常熟悉,因为常用嘛。

这段时间我在完善仿照博客园的问题,就大量的使用到了分部视图,现在来总结一下,让后来的学习者少走一点弯路。

  1. 如果可以,尽量使用母板页,这样可以很好的控制网站的样式。
  2. 采用单独的css文件,单独的js文件,尽量不要在分部视图中定义样式,而是在整体页面中。
  3. 分部视图的html标签应该尽可能的少,除了要显示的内容之外,不要有任何杂质存在。样式css、js等在整体页面添加。
  4. 如果可以,尽量采用html.partial(partialName)或html.RenderPartial(partialName)的方式,而不要用html.Action来作为分部视图的方式,因为这种方法会和控制器交互。
  5. 对分部视图的传值尽量采用Model的方式进行,如果一个分部视图需要传递两个参数,那么我建议你分成两个分部视图。
  6. 采用分部视图会对整体页面的样式调整带来困难,所以我建议先整体做出页面,然后再分成不同的分部视图。
  7. 过多的分部视图会增加服务器的延迟,所以分部视图的控制要得当,我建议控制在10个以内吧,如果服务器允许,更多也是可以的。
  8. 要注意分部视图的标签id的命名,最好采用固定的要规则的命名方式,尽量减少冲突的发生,毕竟同名的标签存在会对程序造成隐患。

我相信,每天进步的您,最后一定有一个好的未来。

每天进步一点,一年就会进步一大步,十年就可以成功,君子当自强不息,君子当好好学习,每天进步