[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年取了数次行业大奖,与抑郁症的斗殴始终贯穿,甚至已受他根本屈服,几乎失去所有在下来的胆子。

末段,挣扎着之客谋了正式的佑助与指导,不再单独抗战,终于渐渐康复。

他将团结多年以及抑郁症抗争的历程画了下,与爱妻一同创作了漫画集《我产生同一单纯让抑郁症的黑狗》。

修中,他一旦报所有人:

抑郁症可怕、强大,不要试图单打独斗;抑郁症又不曾那可怕、强大,有成百上千艺术好降它。

然,我倒怕吃旁人知道。直到无法经受,才开接受救助。

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

若你呢发出同一只是叫抑郁的黑狗,正视其,寻找专业的食指扶驯服它;

倘你身边有人被这么平等止黑狗牵制,试着明亮她们,跟她们聊聊天,帮他们合伙想办法。

逢抑郁症,不要为它吓倒,除了找到办法自处,也求一定要是起友好之社会风气移动下,每个人还生或扶持到您!


©转载请联系我获得授权

接在人间留言讨论

喜爱求点赞转发