当前位置:首页 > 博客园排行 >通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行转

通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行转

  作者:Kevin Lin   来源: 博客园-lxinxuan  

from http://www.cnblogs.com/fubeidong/archive/2007/01/22/626864.html

 

通过避免下列 10 个常见 ASP.NET 缺陷使网站平稳运行()

本文将讨论:

缓存和 Forms 身份验证

视图状态和会话状态

配置文件属性序列化

线程池饱和

模拟和设置配置文件

本文使用了下列技术:

.NET FrameworkASP.NETWindows Server 2003

本页内容

LoadControl 和输出缓存

会话和输出缓存

Forms 身份验证票证生存期

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

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

未缓存的角色

配置文件属性序列化

线程池饱和

模拟和 ACL 授权

不要完全信赖它请设置数据库的配置文件!

结论

ASP.NET 成功的其中一个原因在于它降低了 Web 开发人员的门槛。即便您不是计算机科学博士也可以编写 ASP.NET 代码。我在工作中遇到的许多 ASP.NET 开发人员都是自学成材的,他们在编写 C# Visual Basic® 之前都在编写 Microsoft® Excel® 电子表格。现在,他们在编写 Web 应用程序,总的来说,他们所做的工作值得表扬。

但是与能力随之而来的还有责任,即使是经验丰富的 ASP.NET 开发人员也难免会出错。在多年的 ASP.NET 项目咨询工作中,我发现某些错误特别容易导致缺陷不断发生。其中某些错误会影响性能。其他错误会抑制可伸缩性。有些错误还会使开发团队耗费宝贵的时间来跟踪错误和意外的行为。

下面是会导致 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 以动态加载用户控件并且为了访问控件

此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

相关阅读:

来源:(微信/QQ:420434200,微信公众号:makaidong-com)
       欢迎分享本文,转载请保留出处!

       【原文阅读】:http://www.cnblogs.com/lxinxuan/archive/2007/03/29/692397.html
没有了