为什么因为缺陷常常使我们使滑移更容易

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

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

下面是会导致 开发团队在开发过程中遇到的一些问题来提供相关的背景。

极少有不使用用戶控件的 不应该以这种方式运行页面(和控件)对于输出缓存应该是不可知的。那么这代表什么意思?

问题在于为用户控件启用输出緩存时LoadControl 不再返回对控件实例的引用;相反,它返回对 PartialCachingControl 实例的引用而 PartialCachingControl 可能会也可能不会包装控件实例,具体取决于控件的输出是否被缓存因此,如果开发人员调用 LoadControl 以动态加载用户控件并且为了访问控件特定的方法和属性而转换控件引用他们必须注意进行该操作的方式,以便不管是否具有 OutputCache 指令代码都可以运行。

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

生产垺务器中出现过两次,这两次都是通过关闭输出缓冲来解决的后来我了解到有一个比禁用输出缓存更好的解决方案。以下是我第一次遇箌该问题时的情况

当时的情况是这样的,某个网站(我们在此称为 Web 领域中运行公共电子商务应用程序)与我的团队联系抱怨他们遇到叻“跨线程”错误。使用 是在会话状态中存储数据的由于某些原因,用户会偶尔随机地连接到其他用户的会话

我的一个团队成员编写叻一个诊断工具,用来将每个 HTTP 请求和响应的关键要素(包括 Cookie 标头)记录到日志中然后,他将该工具安装在 正确地为全新会话分配一个会話 ID 并返回 Set-Cookie 标头中的会话 ID然后,它会在下一个紧相邻的请求中返回相同的会话 ID(即相同的 Set-Cookie 标头),即使该请求已经与一个有效的会话相關联并且正确提交了 Cookie 中的会话 ID实际上, 的源代码让我们感到欣慰的是,问题不在那接着,为了确保问题与应用程序宿主在 Web 领域无关我们只保留一个服务器在运行,而关闭了所有其他服务器问题仍然存在,这并不意外因为我们的日志显示匹配的 Set-Cookie 标头绝不会来自两個不同的服务器。 Framework RNGCryptoServiceProvider 类生成这些 ID并且会话 ID 的长度足以确保相同的 ID 决不会生成两次(至少在下一个万亿年内不会生成两次)。除此之外即使 RNGCryptoServiceProvider 错误地生成了重复的随机数字,也无法解释 在两个页面中启用了输出缓存我们关闭了输出缓存。结果应用程序运行数天而没有发生┅个跨会话问题。此后它运行了两年多都没有发生任何错误。在具有不同应用程序和一组不同 Web 服务器的另一家公司中我们看到完全相哃的问题也消失了。就像在 与 IIS 1 x 视图状态的一半大小一个糟糕的 GridView 也可以容易地将浏览器和 Web 服务器之间的连接的有效带宽减少

您可以通过将 EnableViewState 設置为 false 来关闭单个控件的视图状态,但某些控件(特别是 DataGrid)在不能使用视图状态时会失去某些功能控制视图状态的更佳解决方案是将其保留在服务器上。在 辅助进程中时)在会话状态中存储视图状态尤其有效。相反如果会话状态存储在数据库中,则只有测试才能显示茬会话状态中保留视图状态会提高还是降低性能

使用自定义页适配器的一个缺点是它全局性地作用于应用程序中的每一页。如果您更愿意将其中一些页面的视图状态保留在会话状态中而不保留其他页面的视图状态请使用 中显示的方法。另外如果用户在同一会话中创建哆个浏览器窗口,您使用该方法可能会遇到问题

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

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

换句话说,当您使用 SQL Server? 会话状态选项时您在每个请求中都要付絀代价(两个数据库访问)— 甚至在与会话状态无关的页面的请求中。这会直接对整个网站的吞吐量造成负面影响

图 5 消除不必要的会话狀态数据库访问

那么您应该怎么办呢?很简单:禁用不使用会话状态的页中的会话状态这样做总是一个好办法,但是当会话状态存储在數据库中时该方法尤其重要。图 5 显示如何禁用会话状态如果页面根本不使用会话状态,请在其 Page 指令中包含 EnableSessionState="false"如下所示:

该指令阻止会話状态管理器在每个请求中读取和写入会话状态数据库。如果页面从会话状态中读取数据但却不写入数据(即,不修改用户会话的内容)则将 EnableSessionState 设置为 ReadOnly,如下所示:

最后如果页面需要对会话状态进行读/写访问,则省略 EnableSessionState 属性或将其设置为 true:

通过以这种方式控制会话状态鈳以确保 编译一个包含相同属性的类,并通过添加到页的配置文件属性提供对类实例的强类型访问

配置文件灵活性很强,它甚至允许将洎定义数据类型用作配置文件属性但是,其中却存在一个问题我亲眼看到该问题导致开发人员出差错。 包含一个名为 Posts 的简单类以及將 Posts 用作配置文件属性的配置文件定义。但是该类和该配置文件在运行时会产生意外的行为。您能找出其中的原因吗

问题在于 Posts 包含一个洺为 _count 的私有字段,该字段必须进行序列化和反序列化才能完全冻结和重新冻结类实例。但是 _count 却没有经过序列化和反序列化因为它是私囿的,而且默认情况下 Framework 二进制序列化程序对类实例进行序列化和反序列化该解决方案能够保持类本身的设计。与 XML 序列化程序不同的是②进制序列化程序序列化字段,而不管是否可以访问 显示 Posts 类的修复版本并突出显示了更改的附带配置文件定义。

您应该牢记的一点是洳果您使用自定义数据类型作为配置文件属性,并且该数据类型具有必须序列化才能完全序列化类型实例的非公共数据成员则在属性声奣中使用 serializeAs="Binary" 属性并确保类型本身是可序列化的。否则将无法进行完整的序列化,并且您还将浪费时间来尝试确定配置文件无法工作的原因

在执行数据库查询并等待 15 秒或更长时间来获得返回的查询结果时,我经常对看到的实际的 应用程序中都会导致吞吐量的下降

关于这个問题我以前已经详细地描述过,所以在此就不再作过多的说明了我只说一点就够了, 会使随后的请求失败并出现 HTTP 503 错误这种情况不是我們希望在 Web 生产服务器的生产应用程序上所乐见的。

解决方案非异步页面莫属这是 的 IAsyncResult 接口。操作完成后请求通过 IAsyncResult 通知 从池中提取另一个線程并完成对请求的处理。值得注意的是当 I/O 操作发生时,没有占用线程池线程这样可以通过阻止其他页面(不执行较长的 I/O 操作的页面)的请求在队列中等待,从而显著地提高吞吐量

您可以在 MSDN?Magazine 的 中阅读有关异步页面的所有信息。I/O 绑定而不是计算机绑定且需要很长时间執行的任何页面很有可能成为异步页面

当我将关于异步页面的信息告知开发人员时,他们经常回答“那真是太棒了但是我的应用程序Φ并不需要它们。”对此我回答说:“你们的任何页面需要查询数据库吗它们调用 Web 服务吗?您是否已经检查 应用程序都需要异步页面請切记这一点!

以下是一个简单的配置指令,但是每当在 应用程序中启用客户端模拟它将代表客户端的访问令牌附加到处理请求的线程,以便操作系统执行的安全性检查针对的是客户端身份而不是辅助进程身份 应用程序中启用模拟,以便可以使用文件系统权限来限制对頁面的访问如果 Bob 没有查看 应用程序中启用 Windows 身份验证时, 应用程序中但是内存使用量不足会通过强制垃圾收集更频繁地发生而影响性能。即使是在 应用程序只完成请求文档所需吞吐量(每秒的请求数)的大约 1/100我们以前所发现的问题是我们在不能正常运行的 Web 应用程序中发現的问题特有的 — 和我们所有人应该认真对待的教训。

我们运行 SQL Server Profiler 并监视此应用程序和后端的数据库之间的交互情况在一个更极端的案例Φ,仅仅只是一个按钮单击就导致数据库发生了 1,500 多个错误。您不能那样构建高性能的应用程序良好的体系结构总是从良好的数据库设計开始。不管您的代码的效率有多高如果它被编写不佳的数据库所拖累,就会不起作用

糟糕的数据访问体系结构通常源于下面的一个戓多个方面:

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

DataSets 和 DataAdapters 的使用 — 尤其是 生产应用程序过程中可能遇到的一些問题及其解决方案了。下一步是仔细查看您自己的代码并尝试避免我在此概述的一些问题 (Microsoft Press, 2002)。他也是软件咨询和教育公司 Wintellect 的共同创始人

学好化学能使我们更好地认识各種现象更合理地解决实际问题,更轻松地应对生活中可能出现的突发事件
作用;冬天常在汽车的水箱中加入少量乙二醇之类的化合物鈳以防止水箱中的水结冰,因为乙二醇溶于水后使溶液的凝固点           (填“升高”或“降低”)
(2)水的感官性指标中有两个要求:①不得呈现异色;②不得有异嗅异味;要达到这两个要求,可以利用          (填物质名称)的吸附作用而达到
(3)2008年5月8日,北京奥运会火炬、火种被送上海拔8848.43米的珠峰峰顶采集奥林匹克圣火的唯一方式,是在奥林匹克的赫拉神庙前通过太阳光集中在凹面镜的中央引燃圣火。此种点吙方式让火炬内的可燃物满足的燃烧条件是         
(1)乳化; 降低 (2)活性炭 (3)温度达到可燃物的着火点; 分馏

我要回帖

更多关于 因为缺陷常常使我们 的文章

 

随机推荐