[MSDN]通过避免下列 10 只常见 ASP.NET 缺陷而网站平稳运行

文|杉   图|网络

原文:http://www.microsoft.com/china/msdn/library/webservices/asp.net/WebAppFollies.mspx?mfr=true

苦恼这只有“大黑狗”,你得降它**

ASP.NET 成功的中一个因在它们降低了 Web
开发人员的门径。即便你不是电脑是博士也得以编制 ASP.NET
代码。我在工作中遇到的不少 ASP.NET 开发人员都是自学成材的,他们在编辑
C# 或 Visual Basic® 之前还当编制 Microsoft® Excel®
电子表格。现在,他们以编排 Web
应用程序,总的来说,他们所举行的办事值得表彰。

周五,香港,阳光明媚。

只是同能力随之而来的还有事,即使是经验丰富的 ASP.NET
开发人员也免不了会错。在多年之 ASP.NET
项目咨询办事遭到,我发觉一些错误特别容易招缺陷不断产生。其中一些错误会影响属性。其他左会制止可伸缩性。有些错误还会见要开发团队耗费宝贵的光阴来跟错误和意外的行。

一如既往20频繁底气温,让丁几乎忘却了这一度是圣诞以到,立冬已经一月方便。

脚是碰头造成 ASP.NET 生产应用程序的披露过程被冒出问题的 10
独短以及可避免它们的办法。所有示例均来源于自身对真正的铺面构建真正的 Web
应用程序的切身感受,在好几情况下,我会通过介绍 ASP.NET
开发组织以付出过程中遇见的片段问题来供有关的背景。

晖暖暖地洒在身上,手机弹有一致长条微信提醒,打开一看,瞬间任何人口犹僵住了,背后结起一阵寒霜。

LoadControl 和出口缓存

尽少出免行使用户控件的 ASP.NET
应用程序。在产出母版页之前,开发人员使用用户控件来领取公用内容,如页眉和页脚。即使以
ASP.NET 2.0
中,用户控件也提供了有效的道来封装内容以及行跟用页面分为多独区域,这些区域之缓存能力可独立于当完整的页面进行支配(一种名叫段缓存的特殊输出缓存形式)。

用户控件可以行使声明的点子加载,也可以强制加载。强制加载依赖让
Page.LoadControl,它实例化用户控件并返回控件引用。如果用户控件包含自定义类型的成员(例如,公共性质),则您得变该引用并于君的代码访问于定义成员。图
1
中的用户控件实现叫吧 BackColor 的属性。以下代码加载用户控件并于
BackColor 分配一个价:

protected void Page_Load(object sender, EventArgs e)
{
// 加载用户控件并将其添加到页面中
Control control = LoadControl("~/MyUserControl.ascx");
PlaceHolder1.Controls.Add(control);
// 设置其背景色
((MyUserControl)control).BackColor = Color.Yellow;
}

以上代码实际上非常简单,但可是一个候粗心的开发人员掉进去的牢笼。您会找来其中的败吗?

设您猜到拖欠问题与输出缓存有关,那么您是天经地义的。正而你所盼的如出一辙,上述代码示例编译和运行都正常,但是如果尝试用以下语句(完全合法)添加到
MyUserControl.ascx 中:

<%@ OutputCache Duration="5" VaryByParam="None" %>

则当您下一样蹩脚运行该页面时,您将看到 InvalidCastException (oh joy!)
和以下错误信息:

“无法将类型为‘System.Web.UI.PartialCachingControl’的对象转换为类型‘MyUserControl’。”

从而,此代码在无 OutputCache 指令时运行如常,但若是上加了 OutputCache
指令就见面出错。ASP.NET
不应该因为这种方法运行。页面(和控件)对于出口缓存应该是不可知的。那么,这象征什么意思?

问题在于为用户控件启用输出缓存时,LoadControl
不再回到对控件实例的援;相反,它回到对 PartialCachingControl
实例的援,而 PartialCachingControl
可能会见呢说不定无会见卷入控件实例,具体在控件的出口是否受缓存。因此,如果开发人员调用
LoadControl
以动态加载用户控件并且为看控件特定的措施以及总体性而换控件引用,他们必须小心进行该操作的不二法门,以便不管是不是具备
OutputCache 指令,代码都得运作。


2
说明动态加载用户控件以及转换返回的控件引用的正确方法。以下是其行事原理概要:

如果 ASCX 文件缺少 OutputCache 指令,则 LoadControl 返回一个 MyUserControl 引用。Page_Load 将该引用转换为 MyUserControl 并设置控件的 BackColor 属性。

如果 ASCX 文件包括一个 OutputCache 指令并且控件的输出没有被缓存,则 LoadControl 返回一个对 PartialCachingControl 的引用,此 PartialCachingControl 的 CachedControl 属性包含对基础 MyUserControl 的引用。Page_Load 将 PartialCachingControl.CachedControl 转换为 MyUserControl 并设置该控件的 BackColor 属性。

如果 ASCX 文件包括一个 OutputCache 指令并且控件的输出被缓存,则 LoadControl 返回一个对 PartialCachingControl(其 CachedControl 属性为空)的引用。注意,Page_Load 不再继续执行操作。无法设置控件的 BackColor 属性,因为该控件的输出来源于输出缓存。换句话说,根本没有要设置属性的 MyUserControl。

管 .ascx 文件被是不是具有 OutputCache 指令,图
2未遭的代码都将运行。虽然看起复杂一点,但它见面避免烦人的荒唐。简单并无连续代表容易维护。

足球 1回去页首

生平最无法承受之事体虽是隔壁人口的死讯。

对话和出口缓存

说道到输出缓存,ASP.NET 1.1 和 ASP.NET 2.0
都在一个黑的题目,该问题会见影响在 Windows Server™ 2003 和 IIS 6.0
上运行的服务器遭到的输出缓存页。我已经亲眼看到该问题在 ASP.NET
生产服务器被出现过简单糟糕,这简单蹩脚都是透过关闭输出缓冲来缓解的。后来我打听及产生一个比禁用输出缓存还好的化解方案。以下是自个儿先是次于碰到该问题经常的情。

旋即的情景是如此的,某个网站(我们在这称呼 Contoso.com,它于小型 ASP.NET
Web
领域中运行公共电子商务应用程序)与自我之团伙沟通,抱怨他们撞了“跨线程”错误。使用
Contoso.com
网站的客户常常突然遗失已经输入的数量,但可看任何一样用户之相关数据。稍做分析就是发现,跨线程这个描述并无标准;“跨会话”错误越来越贴切。看起
Contoso.com
是以对话状态中储存数据的,由于一些原因,用户会有时随机地连接受其他用户的对话。

本身之一个社成员编写了一个确诊工具,用来用每个 HTTP
请求和响应的重要要素(包括 Cookie
标头)记录及日志被。然后,他拿该工具安装于 Contoso.com 的 Web
服务器上,并让其运转了几乎龙。结果十分鲜明。大概每 100000
只请求中会发出同样潮这样的情况:ASP.NET 正确地也全新会话分配一个对话 ID
并返 Set-Cookie 标头中的对话
ID。然后,它会于产一个紧相邻的恳求被归相同的对话 ID(即,相同之
Set-Cookie 标头),即使该要都和一个可行之对话相关联而对提交了
Cookie 中的对话 ID。实际上,ASP.NET
是轻易以用户从他们协调的对话中切换出并以她们连到其它会话。

俺们蛮好奇,于是开始搜寻原因。我们先是检查了 Contoso.com
的源代码,让咱们深感宽慰的是,问题非以那。接着,为了确保问题及应用程序宿主当
Web
领域无关,我们惟有保留一个服务器在运转,而倒闭了拥有其他服务器。问题还是有,这并无飞,因为咱们的日记显示匹配的
Set-Cookie 标头绝不见面来星星单不等之服务器。ASP.NET
意外地大成了重的对话 ID,这令人难以置信,因为它们采取 .NET Framework
RNGCryptoServiceProvider 类生成这些 ID,并且会话 ID 的长可以保证同等之
ID 决不见面变动两糟(至少在产一个万亿年内未会见扭转两潮)。除此之外,即使
RNGCryptoServiceProvider 错误地十分成了再也的随机数字,也无法解释 ASP.NET
为何不可思议地将有效之对话 ID 替换为新的 ID(不唯)。

无论直觉,我们决定拘留一下输出缓存。当 OutputCacheModule 缓存 HTTP
响应时,它要小心不要缓存了 Set-Cookie 标头;否则,包含新会话 ID
的缓存响应会将缓存响应的装有接收者(以及其请求生成为了缓存响应的用户)连接到同一会话。我们检查了自代码;Contoso.com
在少数个页面被启用了出口缓存。我们关了出口缓存。结果,应用程序运行往往龙要从未生一个跨会话问题。此后,它运行了少于年多还并未有其他不当。在有不同应用程序和一致组不同
Web 服务器的旁一样小合作社受,我们看看完全相同的题材为磨灭了。就如于
Contoso.com 一样,消除输出缓存就能化解问题。

Microsoft 后来确认此行也来 OutputCacheModule
中的题目。(当你读书本文时,可能早就宣告了更新。)当 ASP.NET 与 IIS 6.0
一起利用以启用内核模式缓存时,OutputCacheModule 有时无法从其传递给
Http.sys 的缓存响应中除去 Set-Cookie
标头。下面是引致出现错误的一定事件顺序:

最近没有访问网站(因此也没有对应的会话)的用户请求一个启用了输出缓存的页面,但是其输出当前在缓存中不可用。

该请求执行用于访问用户最新创建的会话的代码,从而导致会话 ID Cookie 在响应的 Set-Cookie 标头中返回。

OutputCacheModule 向 Http.sys 提供输出,但是无法从响应中删除 Set-Cookie 标头。

Http.sys 在后续的请求中返回缓存响应,误将其他用户连接到会话。

故事之寓意又是啊为?会话状态与基础模式输出缓存不能混合使用。如果您在启用输出缓存的页中使用会话状态,并且应用程序在
IIS 6.0
上运行,则您要关闭内核模式输出缓存。您照将受益于出口缓存,但是盖根本模式输出缓存比普通输出缓存快得多,所以缓存不见面雷同有效。有关这问题之详细信息,请参见
support.microsoft.com/kb/917072。

公可由此在页面的 OutputCache 指令中包含 VaryByParam=”*”
属性来关闭单个页面的基业模式输出缓存,虽然这么做可能致内存需求骤增。另一样种植更安全之法子是经过当
web.config 中蕴含下列元素来关闭所有应用程序的根本模式缓存:

<httpRuntime enableKernelOutputCache="false" />

您还可以以注册表设置来全局性地剥夺内核模式输出缓存,即夺所有服务器的基石模式输出缓存。有关详细信息,请参见
support.microsoft.com/kb/820129。

每次自己闻客户报告会话来了费解之问题,我都见面了解他们是不是在其余页面被应用了出口缓存。如果确实下了出口缓存,并且宿主操作系统是
Windows Server
2003,我会建议她们禁用内核模式输出缓存。问题一般就会见缓解。如果问题远非缓解,则错误存在被代码中。警惕!

足球 2返页首

诚如之春秋,共同之前往港读书经历,即便没有过交集却也像身边其他一个带有温度,一起很笑过,一起彷徨过之活跃的人数。

Forms 身份验证票证生存期

你能够找来以下代码的题目为?

FormsAuthentication.RedirectFromLoginPage(username, true);

斯代码看似没有问题,但不许当 ASP.NET 1.x
应用程序中使用,除非采用程序中其他职务的代码抵消了此语句的阴暗面作用。如果您不能够确定由,请继续看。

FormsAuthentication.RedirectFromLoginPage 执行两独任务。首先,当
FormsAuthenticationModule
将用户重定向到登录页时,FormsAuthentication.RedirectFromLoginPage
将用户重定向到她们原来请求的页面。其次,它宣布一个身份验证票证(通常携带在
Cookie 中,而且以 ASP.NET 1.x 中总是携带在 Cookie
中),这个票允许用户以预约的一段时间内保持已透过身份验证状态。

题目不怕在此时刻段。在 ASP.NET 1.x 中,向 RedirectFromLoginPage
传递另一个为 false 的参数会出一个即身份验证票证,该字默认情况下在
30 分钟过后到。(您得运用 web.config 的 元素中的 Timeout
属性来重新改超时期限。)然而,传递另一个乎 true
的参数则会生出一个世代身份验证票证,其有效期为 50
年!这样即便会见发问题,因为若有人窃取了该身份验证票证,他们便得以票的有效期内以受害者的位置看网站。窃取身份验证票证有多智

在公无线访问点探测未加密的通信、跨网站编写脚本、以物理方法访受害者的微机等等
— 因此,向 RedirectFromLoginPage 传递 true
比禁用你的网站的安全性好不了有些。幸运的凡,此题材既在 ASP.NET 2.0
中拿走了化解。现在底 RedirectFromLoginPage 以同样的道接受以 web.config
中也即与千古身份验证票证指定的过期。

相同种植缓解方案是永不当 ASP.NET 1.x 应用程序的 RedirectFromLoginPage
的老二个参数中传送
true。但是及时不切实际,因为登录页的性状一般是富含一个“将自身保持也报到状态”框,用户可选中该框以接收永久而无是临时身份验证
Cookie。另一样栽缓解方案是以 Global.asax(如果你愿意的语句,也可以用
HTTP 模块)中之代码段,此代码段会在含有永久身份验证票证的 Cookie
返回浏览器之前对那进展修改。


3
包含一个这么的代码段。如果此替码段位于 Global.asax 中,它见面修改传出永久
Forms 身份验证 Cookie 的 Expires 属性,以要 Cookie 在 24
小时后过。通过改注释也“新的逾期日期”的实践,您可以将过设置也您喜爱的旁日期。

而或许会见当奇怪,Application_EndRequest 方法调用本地 Helper 方法
(GetCookieFromResponse) 来检查身份验证 Cookie 的散播响应。Helper
方法是化解 ASP.NET 1.1 中其他一个错误的方法,如果你使用
HttpCookieCollection 的字符串索引生成器来检查无有的
Cookie,此错误会促成伪 Cookie 添加到应中。使用整数索引生成器作为
GetCookieFromResponse 可以化解拖欠问题。

足球 3回来页首

才二十几寒暑之年纪,本应诗酒趁年华,本应平等条豪气挥斥方遒。

视图状态:无声的性质杀手

打某种意义上说,视图状态是常有最好光辉之事情。毕竟,视图状态让页面和控件能够在回发之间维持状态。因此,您不要像以风俗的
ASP
中那样编写代码,以备以单击按钮时文本框中的文本消失,或以回发后更查询数据库和另行绑定
DataGrid。

而视图状态吧出弱点:当她增长得过十分时,它就成一个清冷之习性杀手。某些控件(例如文本框)会冲视图状态作出相应判。其他控件(特别是
DataGrid 和 GridView)则因显示的信息量确定视图状态。如果 GridView 显示
200 或 300 行数据,我会怕。即使 ASP.NET 2.0 视图状态大致是 ASP.NET
1 x 视图状态的一半大小,一个不好之 GridView 也得好地将浏览器和 Web
服务器之间的接连的有效拉动富减少 50% 或重多。

卿可以经以 EnableViewState 设置为 false
来关闭单个控件的视图状态,但某些控件(特别是
DataGrid)在不克用视图状态时会失去某些职能。控制视图状态的更佳解决方案是将该保存在服务器上。在
ASP.NET 1.x 中,您得再次写页面的 LoadPageStateFromPersistenceMedium 和
SavePageStateToPersistenceMedium 方法并以你喜欢的章程处理视图状态。图
4
中之代码显示的再度写不过防止视图状态保留在隐藏字段遭遇,而将其保存在对话状态被。当及默认会讲话状态进程模型一起以时(即,会话状态存储于内存中的
ASP.NET
辅助进程面临时),在对话状态中蕴藏视图状态越来越有效。相反,如果会话状态存储于数据库中,则只有测试才能够显在对话状态中保留视图状态会增强或者下降性能。

当 ASP.NET 2.0 中以同样的不二法门,但是 ASP.NET 2.0
能够提供更简便易行的方式以视图状态保留在对话状态被。首先,定义一个自定义页适配器,其
GetStatePersister 方法返回 .NET Framework SessionPageStatePersister
类的一个实例:

public class SessionPageStateAdapter :
System.Web.UI.Adapters.PageAdapter
{
public override PageStatePersister GetStatePersister ()
{
return new SessionPageStatePersister(this.Page);
}
}

下一场,通过以 App.browsers 文件按以下方式放入应用程序的 App_Browsers
文件夹,将从定义页适配器注册也默认页适配器:

<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.Page"
adapterType="SessionPageStateAdapter" />
</controlAdapters>
</browser>
</browsers>

(您可以将文件命名为卿喜欢的其它称,只要其的扩大名吧 .browsers
即可。)此后,ASP.NET 将加载页适配器并运用返回的
SessionPageStatePersister 以保存有页面状态,包括视图状态。

行使于定义页适配器的一个短是它全局性地作用为应用程序中之各一样页。如果你更愿拿里面有页面的视图状态保留在对话状态被若无保留其他页面的视图状态,请动图
4
中显示的计。另外,如果用户在同一会话中开创多只浏览器窗口,您运该措施可能会见遇上题目。

足球 4回去页首

立即通,都在一个落寞绝望的夜晚陨落,徒留悲痛欲绝的二老,唏嘘流泪的亲朋好友。

SQL Server 会话状态:另一个性杀手

ASP.NET 使得在数据库被储存会话状态变得简单:只待切换 web.config
中的开关,会话状态就会轻松地运动及后端数据库。对于在 Web
领域受到运行的应用程序来说,这是同一起重大职能,因为其同意该领域面临之每个服务器共享会话状态的一个公共库。添加的数据库活动降低了单个请求的性,但是可伸缩性的加强弥补了性的损失。

当下看起还还对,但是若略微考虑一下下列几点,情况就会见迥然不同:

即使在使用会话状态的应用程序中,大多数页也不使用会话状态。

默认情况下,ASP.NET 会话状态管理器对每个请求中的会话数据存储执行两个访问(一个读取访问和一个写入访问),而不管请求的页是否使用会话状态。

更换句话说,当你使用 SQL Server™
会话状态选项时,您在每个请求中还如付出代价(两单数据库访问)—
甚至于与会话状态无关的页面的恳求被。这会一直对合网站的吞吐量造成负面影响。

 

足球 5

祈求 5 消除无必要之对话状态数据库访问

 

那您该怎么收拾为?很粗略:禁用无采取会话状态的页中的对话状态。这样做总是一个好方式,但是当会说话状态存储在数据库被不时,该措施尤其要。图
5 显示怎么禁用会话状态。如果页面向不以会话状态,请于其 Page
指令中蕴含 EnableSessionState=”false”,如下所示:

<%@ Page EnableSessionState="false" ... %>

该令阻止会话状态管理器在每个请求被读取和写入会话状态数据库。如果页面从会话状态被读取数据,但可无写副数据(即,不改用户会话的情),则拿
EnableSessionState 设置也 ReadOnly,如下所示:

<%@ Page EnableSessionState="ReadOnly" ... %>

最终,如果页面需要对会话状态进行读/写访问,则略 EnableSessionState
属性或将该安也 true:

<%@ Page EnableSessionState="true" ... %>

经过以这种办法决定会话状态,可以保 ASP.NET
只以审需要经常才看会话状态数据库。消除不必要的数据库访问是构建大性能应用程序的第一步。

附带说一下,EnableSessionState 属性是堂而皇之之。该属性自 ASP.NET 1.0
以来就曾进行了证,但是自迄今以百般少看开发人员利用该属性。也许是坐她对内存中的默认会说话状态模型并无殊重中之重。但是它们对于
SQL Server 模型也异常要紧。

足球 6回去页首

人生很丰富,有时也非常不够。

无缓存的角色

以下语句经常出现于 ASP.NET 2.0 应用程序的 web.config 文件与介绍
ASP.NET 2.0 角色管理器的言传身教中:

<roleManager enabled="true" />

可于以上所示,该语句实在会针对性能有显著的负面影响。您知道为何吧?

默认情况下,ASP.NET 2.0
角色管理器不见面缓存角色数据。相反,它见面当每次要规定用户属于哪个角色(如果起)时参考角色数据存储。这表示如果用户通过了身份验证,任何利用角色数据的页(例如,使用启用了安康裁减设置的网站图的页,以及采取
web.config 中冲角色的 URL
指令展开走访中限制的页)将致角色管理器查询角色数据存储。如果角色存储在数据库被,那么对每个请求需要看多只数据库的事态,您得轻松地排访问多个数据库。解决方案是布角色管理器以在
Cookie 中缓存角色数据:

<roleManager enabled="true" cacheRolesInCookie="true" />

您得运用另外<roleManager> 属性控制角色 Cookie 的表征 —
例如,Cookie
应保持有效的为期(以及角色管理器因此回到角色数据库的频率)。角色 Cookie
默认情况下是经签字和加密的,因此安全风险虽非为零星,但也具有缓解。

足球 7回页首

沉淀在泥塘中之食指,被推到牛角尖上的总人口,有时眼前不得不见到这之窘境。

布置文件属性序列化

ASP.NET 2.0
配置文件服务吗保障每个用户之状态(例如个性化首选项与言语首选项)的问题提供了一个备的解决方案。要动用安排文件服务,您可以定义一个
XML 配置文件,其中蕴藏要封存的意味单个用户之属性。然后,ASP.NET
编译一个含有相同属性的切近,并由此长到页的布置文件属性提供对类实例的强类型访问。

布文件灵活性很强,它甚至同意将从今定义数据类型用作配置文件属性。但是,其中却有一个题目,我亲眼看到该问题造成开发人员出讹。图
6
包含一个名吧 Posts 的略近乎,以及将 Posts
用作安排文件属性的安排文件定义。但是,该类和该配置文件于运作时会生出意想不到的作为。您能够检索来其中的由吗?

题目在 Posts 包含一个誉为也 _count
的私家字段,该字段必须进行序列化和倒序列化,才会完全结冰以及更冻结类实例。但是
_count 也没有经过序列化和反序列化,因为其是私房的,而且默认情况下
ASP.NET 配置文件管理器使用 XML
序列化对自定义类型进行序列化和倒序列化。XML
序列化程序将忽略非公共成员。因此,会针对 Posts
的实例进行序列化和倒序列化,但是每次反序列化类实例时,_count 都见面重设为
0。

同种缓解方案是设 _count
成为公共字段而不私出字段。另一样种缓解方案是行使国有读/写属性封装
_count。最佳解决方案是拿 Posts 标记为而序列化(使用
SerializableAttribute),并拿布文件管理器配置为用 .NET Framework
二迈入制序列化程序对类实例进行序列化和反序列化。该解决方案能保障类似本身的计划性。与
XML
序列化程序不同的凡,二前进制序列化程序序列化字段,而不管是否足以拜。图
7
显示 Posts 类的修复版本并鼓起展示了移的附带配置文件定义。

公当牢记的一点凡是,如果你使用由定义数据类型作为配置文件属性,并且该数据类型具有必须序列化才会完全序列化类型实例的非公共数据成员,则于性能声明中行使
serializeAs=”Binary”
属性并确保项目我是只是序列化的。否则,将无法展开总体的序列化,并且您还以浪费时间来尝试确定安排文件无法工作的原故。

足球 8返页首

一向乐观的人数,选择亲手结束自己的人命。

线程池饱和

以履数据库查询并等候 15
秒或再丰富时来博回的查询结果经常,我时常对望底莫过于的 ASP.NET
页数感到异常惊奇。(我吧拭目以待了 15
分钟才看到查询结果!)有时,延迟凡是出于返回的数据量很要命而导致的不可避免的不得已结果;而有时,延迟虽是出于数据库的筹划不佳导致的。但无论是啊由,长时的数据库查询或其他类型的增长时
I/O 操作以 ASP.NET 应用程序中还见面招吞吐量的降。

有关这题目我原先都详尽地描述了,所以在这个就是不再发作了多之说明了。我只说一样点即够用了,ASP.NET
依赖让简单的线程池处理要,如果持有线程都受霸占来等待数据库查询、Web
服务调用或其它 I/O
操作完成,则当有操作就同时释放出一个线程之前,其他请求都要排队等候。当求排队时,性能会急剧下降。如果队列已满,则
ASP.NET 会使随后的请失败并出现 HTTP 503 错误。这种情况不是咱盼望于
Web 生产服务器的养应用程序上所笑见的。

解决方案免异步页面莫属,这是 ASP.NET 2.0
中极品却鲜为人知的效果有。对异步页面的呼吁于一个线程上上马,但是当它开始一个
I/O 操作时,它用返回该线程以及 ASP.NET 的 IAsyncResult
接口。操作完后,请求通过 IAsyncResult 通知 ASP.NET,ASP.NET
从池子中提另一个线程并做到对要的处理。值得注意的凡,当 I/O
操作发生时,没有占用线程池线程。这样好经过阻止其他页面(不执行于丰富之
I/O 操作的页面)的求在班中等待,从而显著地增强吞吐量。

汝可以在 MSDN®Magazine 的 2005 年 10
月刊遭遇读书有关异步页面的所有信息。I/O
绑定而休是计算机绑定且需要充分丰富日子实施之其它页面很有或成异步页面。

当我以关于异步页面的音信告诉开发人员时,他们时常对“那真是太硬了,但是我之应用程序中并不需要它们。”对这我答说:“你们的其余页面需要查询数据库吗?它们调用
Web 服务也?您是不是早已检查 ASP.NET
性能计数器中有关排队求和平均等待时之统计信息?即使你的应用程序至今运行如常,但是就您的客户规模之提高,应用程序的负荷可能会见增多。”

实则,绝大多数实际的 ASP.NET 应用程序都要异步页面。请牢记这或多或少!

足球 9回到页首

毫不怪,脸上的笑脸只是他们心挣扎痛苦的伪装。

模拟和 ACL 授权

以下是一个简练的配备指令,但是于在 web.config
中看到其时都叫自身眼前一亮:

<identity impersonate="true" />

夫命令在 ASP.NET
应用程序中启用客户端模拟。它以意味着客户端的访问使牌附加到拍卖要的线程,以便操作系统执行之安全性检查针对的凡客户端位而休是帮扶进程身份。ASP.NET
应用程序很少得效法;我之经验告诉我,开发人员通常都是由错误的原故使启用模拟的。以下是由所在。

开发人员经常于 ASP.NET
应用程序中启用模拟,以便可以使文件系统权限来界定对页面的拜会。如果 Bob
没有翻动 Salaries.aspx
的权位,则开发人员将会见启用模拟,以便可以透过以访问控制列表 (ACL)
设置也拒绝 Bob 的读取权限,阻止 Bob 查看
Salaries.aspx。但是在以下隐患:对于 ACL 授权来说,模拟是休必要之。在
ASP.NET 应用程序中启用 Windows 身份验证时,ASP.NET 会活动吗要的每个
.aspx 页面检查 ACL
并拒绝没有读取文件权限的调用者的乞求。即使禁用了模拟,它以会如此操作。

有些时候用证实模拟的客观。但是若便可以据此精美的宏图来避免它们。例如,假定
Salaries.aspx
在数据库被查询只有管理人员才会理解之工钱信息。通过模拟,您可利用数据库权限拒绝不管理人员查询工资数额的力量。或者你得无考虑模拟,并且经过也
Salaries.aspx 设置 ACL
以要不管理人员不享读取权限,从而限制对工资多少的走访。后同栽方法提供的属性更不错,因为她完全避免了套。它吗消除了未必要之数据库访问。为什么查询数据库仅由安全原因被拒绝?

顺便说一下,我就帮助对一个习俗的 ASP
应用程序进行故障排除,该应用程序由于内存占用不深受限制而定期重新起动。一个从未更的开发人员将对象
SELECT 语句子转换成了 SELECT
*,而并未考虑而询问的阐明包含图像,这些图像很充分还要数量很多。问题由匪检测到内存泄漏而恶化。(我之托管代码领域!)多年来运作正常化的应用程序开始突然止住工作,因为以前返回一两千字节数据的
SELECT
语词现在倒是回了几兆字节。如果重复添加不充分的版本控制,开发组织的生活将不得不“亢奋起来”—
这里所谓的“亢奋”,就不啻当您在晚若上床时,还只能看正在你的儿女玩乐令人嫌的足球玩一样。

辩论及,传统的内存泄漏不见面发在一齐出于托管代码组成的 ASP.NET
应用程序中。但是内存使用量不足会通过强制垃圾收集更累地来如影响性。即使是当
ASP.NET 应用程序中,也要是当心 SELECT *!

足球 10回来页首

独抱头痛哭的早晚够多,就认为可以转移来对人们时之冷自若。当笑脸都深受了人家,剩下的只有更加老的清相伴。

永不全相信它 — 请设置数据库的配置文件!

用作一如既往叫做顾问,我不时给询问怎么应用程序没有循预想执行。最近,有人打听自己之组织为何
ASP.NET 应用程序只完成请求文档所用吞吐量(每秒的请求数)的大致
1/100。我们原先所发现的题材是我们在匪克健康运行的 Web
应用程序中窥见的问题特有的 — 和咱们具备人相应认真对待的训诫。

咱们运行 SQL Server Profiler
并监视这应用程序和后端的数据库里的相互情况。在一个复绝的案例中,仅仅只是一个按钮单击,就造成数据库有了
1,500
多单错。您不可知那么构建大性能的应用程序。良好的体系布局总是由优的数据库设计开始。不管你的代码的效率来多强,如果其让编辑不优秀之数据库所拖累,就见面不起作用。

坏之多少看体系布局通常来自下面的一个要么多个点:

拙劣的数据库设计(通常由开发人员设计,而不是数据库管理员)。

DataSets 和 DataAdapters 的使用 — 尤其是 DataAdapter.Update,它适用于 Windows 窗体应用程序和其他胖客户端,但是对于 Web 应用程序来说通常不理想。

具有拙劣编制计算程序、以及执行相对简单的操作需消耗很多 CPU 周期的设计糟糕的数据访问层 (DAL)。

务必事先确定问题才能够针对该展开处理。确定数据看问题的方式是运行 SQL Server
Profiler
或一致的家伙为查看后台正在尽的操作。检查应用程序和数据库中的通信后,性能调整才大功告成。尝试一下
— 您或许会见对您的发现震惊。

足球 11回页首

使你身边的口正在遭受困难,跟他/她聊聊天,不要擅自相信他/她的“我足球好好”,或许,你得挽救一久人命。

结论

现今公已经了解在生成 ASP.NET
生产应用程序过程中或碰到的一对题材及其解决方案了。下一样步是细心查看您自己之代码并尝试避免自己当这概述的有些题材。ASP.NET
可能跌了 Web
开发人员的窍门,但是你的应用程序完全产生理由灵活、稳定与快。请认真考虑,避免出现新手易犯的错误。


8
提供了一个简单检查列表,您得应用她来避免本文中讲述的症结。您可以创造一个类似之安康缺陷检查列表。例如:

您是否已经对包含敏感数据的配置节进行加密?

您是否正在检查并验证在数据库操作中使用的输入,是否使用了 HTML编码输入作为输出?

您的虚拟目录中是否包含具有不受保护的扩展名的文件?

使你重视网站、承载网站的服务器和她所依赖之后端资源的完整性,则这些问题非常主要。

本年7月,一员16夏的英国老姑娘Maisie结束了自己之生命。

在家人眼中,他们干近乎,Maisie还正在开开心心地设计下单月之度假旅行。

截至整理其底旧物时才发觉,她的房间里散落着这些写在”I’m fine“的纸条。

然,没有丁想到了,这是其去世前起的末段无声而清的呼救: “Help
me
“.

01

抑郁症没有你想像的那多。

光17年,统计在案的,见诸报端的香港生自杀事件便愈及31于。16年38从,更已出现过连年高空生七自学生自杀事件,引起社会震动。

自小学生到博士生,更遑论已上社会之芸芸众生,数不彻底的丁正给抑郁困扰,甚至据此好的人命也抑郁症献祭。

科大化学博士葛炜炜以宿舍自缢身亡的新闻报道还历历在目。

一个全国化学竞赛一等奖的学童,保送进南充分试点班,保研的优秀学生;一个科大“内地学生学者联谊会”副主席,足球队负责人;一个以人们眼中活泼、开朗、乐观的外。

末段没有会匹敌过学业与就业之重复压力。

“neverworried的blog——一蓑烟雨任平生”,这是葛炜炜的博客名,也是他本着自己生活的渴望。在末一首博文被他形容道:

“我是否尽急功近利了,或者说极端功利了?使得自己化了一个拘禁不显现春天的盲人?我是否太尊重这Ph.D.(博士)学位,以至于只顾着前行狂奔?实验室,宿舍,加上间或的街市超市,差不多就改成了自在之方方面面……我为没选择留,但自己倒得太抢,以至于还未懂得路边是否有花在开放。在自我割舍了春之还要,春天为放弃了我。”

一旦你能清醒过来,身边的食指自然大声地报告你:春天从来不会放弃而,所以恳请您为得毫无放弃春天!

02

带英国人数逃离纳粹独裁魔掌的英国首相丘吉尔,也已长期地受抑郁症的折磨。

外来一致句子名言:“心的烦躁就像就野鸡狗,一有会就是卡住自家非放开。”从此,“黑狗”就变成了英语世界被愤懑的代名词。

Matthew
Johnstone也是一模一样叫作抑郁症患者。二十年起,抑郁症这不过野鸡狗就是和他如果影随形。

用作一如既往称为插画师和设计师,虽然他干活15年获得了数次业大奖,与抑郁症的格斗始终贯穿,甚至一度让他到底屈服,几乎失去所有在下来的胆略。

最后,挣扎着之异谋了标准的援和指导,不再独抗战,终于渐渐康复。

外拿好多年和抑郁症抗争的经过画了下来,与妻子一同写了漫画集《我生平等单纯为抑郁症的黑狗》。

题被,他要是告知所有人:

抑郁症可怕、强大,不要试图单打独斗;抑郁症又没那么可怕、强大,有很多措施可以降它。

可,我也怕吃人家知道。直到无法接受,才开始接受帮助。

坚持不懈锻炼、静心和著录。

使你为发生一样单独名抑郁的黑狗,正视它,寻找专业的人拉驯服它;

假若你身边有人被如此平等只黑狗牵制,试着明亮他们,跟他们聊聊天,帮她们一同想办法。

遇抑郁症,不要受她吓倒,除了找到方法自处,也要一定要自自己之社会风气移动下,每个人还发出或拉到你!


©转载请联系自身取得授权

接在人间留言讨论

爱求点赞转发