【发布时间】:2011-03-31 05:53:32
【问题描述】:
使用 HTTPHandler 与 .aspx 相比有哪些优势?它是否具有相同的功能,是否重量更轻、速度更快?
有什么缺点?
【问题讨论】:
-
一个很好的问题,但几乎可以肯定是一个骗子,它被广泛讨论并且很容易在谷歌上搜索。
标签: .net asp.net httphandler
使用 HTTPHandler 与 .aspx 相比有哪些优势?它是否具有相同的功能,是否重量更轻、速度更快?
有什么缺点?
【问题讨论】:
标签: .net asp.net httphandler
根据页面/处理程序正在做什么,使用普通处理程序而不是页面,我的性能提升了 5% 到 15% - 它们通常是生成图像、json 等、处理来自 ajax 请求的后台任务的好选择,或者做一些事情,比如从图像请求中记录访问者。
如果您要写出大量 html,使用处理程序会有点痛苦 - 构建 html 字符串的潜在错误通常超过了性能优势。
您使用处理程序丢失的一个重要的事情是使用输出缓存声明进行缓存 - 您当然可以通过编程方式自己连接它,但我发现 aspnet 通常在缓存管理方面比我做的任何事情都做得更好写得快。
【讨论】:
请记住,当您的 .aspx 页面被编译时,无论是直接还是间接(通过从直接或间接继承的“代码隐藏”类继承),它将被转换为派生自 System.Web.UI.Page 的类来自Page。
Page 实现了IHttpHandler,所以你永远不会不使用IHttpHandler。
快速浏览Page 的成员列表可以很好地回答这个问题。发生了很多事情,并且为派生类(即 .aspx 文件和代码隐藏)提供了很多东西。那是在我们考虑解析 .aspx 文件以使编写包含大量“模板”代码的代码变得非常容易之前。
如果您编写自己的处理程序,您将失去所有这些。失去它会给你带来性能提升,但没有你想象的那么多,如果不使用它,很多东西都不会花费。事实上,如果您确实丢失了您需要的东西,那么您自己找回它的方法可能效率会降低。
如果编写相关处理程序的自然方式是让所有事情直接或间接(方法调用)从代码隐藏中的单个事件处理程序发生,并且使用空的 .aspx,那么可能更清楚把它写成一个处理程序,在这种情况下做。否则,您要坚持使用 .aspx 文件。
【讨论】:
.aspx 是指 System.Web.UI.Page 的一个实例,正如您在该类的元信息中看到的那样,它是 IHttpHandler 的实现 - 换句话说(粗略地说)一个 Page 实例 is 一个 HttpHandler(这是重点)加上一大堆赋予它页面行为的东西。
因此,不同之处在于,使用 Page 您可以利用它为您提供的所有东西(视图状态、控制性、生命周期等),但代价是必须拥有所有这些开销,无论是否无论您是否需要它,与编写自己的实现相比,您可以使其轻量级并适合您选择的目的,但必须自己编写。
因此,当您对页面支持不感兴趣时,HttpHandler 特别适合,因为您没有交付语义页面响应 - 交付 XML、JSON、图像或除 HTML 样式标记之外的任何内容几乎肯定是错误的有一个页面。
在实践中,我选择第三个选项 - MVC - 大多数时候:)
【讨论】:
Aspx 使用具有复杂页面生命周期和大量附加处理的全功能 Web 表单。 HttpHandler 是纯粹的轻量级的。它只有您实现的功能。
【讨论】: