Application_Start 与 OnInit 与构造函数

2023-12-27

自从 12(大约)年前我开始编写经典 ASP 以来,我就一直在研究这个问题,但我从未找到一个很好的解决方案,因为 ASP 和 ASP.NET 的体系结构一直是不良实践的沼泽,魔法共享单例等。我最大的问题是HttpApplication http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx对象及其非事件事件 (Application_Start, Application_End, etc.).

如果您想在 HTTP 应用程序的整个生命周期中只执行一次操作,Application_Start是显而易见的地方。正确的?不完全是。首先,这本身不是一个事件,它是一个神奇的命名约定,遵循该约定时,会导致 IIS 创建的每个 AppDomain 调用该方法一次。

除了神奇的命名约定是一种可怕的做法之外,我开始认为这可能是不存在这样的东西的原因Start事件于HttpApplication目的。所以我尝试了确实存在的事件,例如Init。好吧,这也不是一个真正的事件,它是一个可重写的方法,这是下一个最好的事情。

看来Init()方法的每个实例化都会被调用HttpApplication对象,每个 AppDomain 都会发生多次。这意味着我不妨将启动逻辑放入HttpApplication对象的构造函数。

现在我的问题是,为什么我不应该将启动逻辑放在构造函数中?为什么甚至Init()存在并且我需要关心吗Application_Start?如果我这样做,任何人都可以解释为什么在这个伪事件中没有正确的事件或可重写的方法HttpApplication object?

谁能向我解释为什么在典型的 ASP.NET 应用程序中,我的 8 个实例HttpApplication创建(这会导致构造函数和Init当然,要跑同样多的次数;这可以通过锁定和共享静态布尔值来缓解initialized)当我的应用程序只有一个 AppDomain 时?


Asp.Net 运行时保留一个 HttpApplication 对象池。每个 .aspx 请求都由从池中分配的单个对象(在您的情况下为 8 个对象)处理。

您问题的答案,Application_Start 事件确实被调用,但仅针对 HttpApplication 的第一个实例,而不是后续实例,因此您可以确保每当您的应用程序启动或 IIS 的应用程序池重新启动时,它都会被调用一次。 Application_OnEnd 事件也是如此(最后一个实例)

同时,在 HttpApplication 对象的每个实例上都会调用 Init() 和 Dispose()。这将在每个实例(也称为每个请求)上调用。

他们为什么要这样做..?也许是为了平衡性能和内存优化。

希望我回答了你的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Application_Start 与 OnInit 与构造函数 的相关文章

  • 为什么 Response.Write() 无法将 CSV 文件导出到浏览器?

    我正在尝试将 DataTable 的内容作为 Excel csv 文件导出到用户的浏览器 当我单击 导出 按钮并在调试器中单步执行代码时 一切看起来都在发生 但实际上没有文件发送到浏览器 问题是 我在另一个项目中使用了这个完全相同的代码 并
  • 未为 OPTIONS Ajax 请求设置标头

    我有一个ascx page GetToken ashx public void ProcessRequest HttpContext context context Response ContentType text plain conte
  • ASP.NET GridView 项目模板

    好的 我有一个 GridView 并且有一个列 如果文件存在 我希望将其作为链接 否则我只想将其作为标签 现在 我正在使用参数中传递的 Row 更改 RowDataBound 事件处理程序上的控件 我不太喜欢这个 因为我对列 ID 进行了硬
  • 使用 Lambda 表达式从字段名称中选择不同的字段

    我需要从数据库表中获取两个字段 使用 linq to sql 检索 一个字段是日期时间 并且是固定字段 另一个字段始终是十进制 但该字段可以不同 该表保存的货币数据每天以不同的货币处理两次 因此可能具有 AM USD PM USD AM E
  • JQuery:获取 ASP.NET CheckBoxList 控件中复选框的值/文本/innerHtml

    我有一堆由 asp net CheckBoxList 控件生成的复选框 我想获取用户在页面上的控件旁边看到的文本 对于类似的控件 例如 RadioButtonList 我可以通过执行以下操作在 jQuery 中获取它们的值 var sele
  • 当我想要发布项目时:“指定的路径、文件名或两者都太长”

    当我想运行或发布网络项目时 我收到此错误 严重性代码 说明 项目文件行抑制状态 错误 无法评估项目元数据 FullPath 项目元数据 FullPath 无法应用于路径 jquery ui 1 10 3 custom development
  • 每次使用会话来获取/设置对象属性

    我尝试搜索这个 但我什至不知道如何用它来搜索 我试图做的是有一个类 每次我访问它来更改它时 我实际上都是从会话中获取和设置值 这是我正在尝试做的事情 到目前为止我所做的事情 public class example public int p
  • 使用具有外键的表将数据从 asp.net 页面插入到我的数据库中

    我是一名初学asp net程序员 我的项目是网上购物课程 我有一些问题 我有 4 个表 它们之间有一些外键 CREATE TABLE dbo orderdetails orderid INT NOT NULL classid INT NOT
  • 无法使用 Javascript 重定向到另一个页面

    在 html 文件中使用 Javascript 重定向页面 我这样使用 window location href http www google com 它工作正常 但是当我在 aspx 中尝试时它不起作用 下面是我的代码 提前致谢
  • 如何在登录名控件中显示用户名

    我有一个母版页 其中包含基于母版页的所有后续页面上显示的登录视图内容 我有一个用户名控件也嵌套在登录视图中 用于在用户登录时显示用户名 母版页中登录视图的代码显示如下 div class loginView div
  • 如何使用 BoundFields 将 FooterTemplate 添加到 GridView

    希望您周末愉快 终于我有了一些编辑 删除事件器来与 LINQ 支持一起工作 我有一个添加记录事件 我知道它正在工作 但是在尝试了一部分之后 我不知道如何在页脚中添加一些文本框 所以它是从页眉到页脚的一行 没有向右或向左移动 有人可以帮助我吗
  • 使用 SendMessage 通过电子邮件发送文件附件而不保存文件

    我可以发送电子邮件和所有内容 但无法创建有效的 Attachment 放入我的电子邮件中 我在网上找到的所有示例都假设它以某种方式保存在我的计算机本地并通过路径链接它 但事实并非如此 在我的方法中 我使用 Winnovative 创建文件
  • 将 NameValueCollection 绑定到 GridView?

    我应该使用哪种集合来将 NameValuecollection 转换为可绑定到 GridView 直接做的时候没效果 aspx cs 中的代码 private void BindList NameValueCollection nvpLis
  • OWIN中间件可以使用http会话吗?

    我有一些为 ASP NET 和 SignalR 复制的代码 我决定将其重写为 OWIN 中间件以删除这些重复 一旦我运行它 我注意到HttpContext Current Session为空 并且我没有看到任何会话对象IOwinContex
  • 如何使自定义错误页面在 ASP.NET MVC 4 中工作

    我想要显示 500 404 和 403 的自定义错误页面 这是我所做的 在 web config 中启用自定义错误 如下所示
  • 错误:“无法在 Web 服务器上开始调试...”ASP.NET 4.0

    当我想在 IIS 服务器上创建网站时出现错误 我使用的是 Windows 7 和 Visual Studio 2010 我是否必须为 IIS 注册或配置 asp net 4 0 这里没有太多细节 但是当我尝试在刚刚从 3 5 更改为 4 0
  • 在 javascript 中访问 ajax POST 响应

    我正在从 javascript 函数发出 ajax POST 请求 function UpdateMetrics ajax type POST url MyHandler ashx Param1 value1 data contentTyp
  • 您可以运行一个从 ASP.Net 项目运行计划任务的“服务”吗?

    我为我们的客户构建了一个 Windows 服务 它从数据库中收集所有已更改 新的行 将它们转换为 CSV 然后每晚通过 FTP 将它们上传到某个地方 现在事实证明 他们无权安装或运行 Windows 服务 这是一个仅 Web 路径托管的解决
  • 如何从 Web API 应用程序返回 PDF

    我有一个在服务器上运行的 Web API 项目 它应该从两种不同类型的源返回 PDF 实际的可移植文档文件 PDF 和存储在数据库中的 base64 字符串 我遇到的问题是将文档发送回客户端 MVC 应用程序 剩下的部分是关于所发生的一切以
  • 使用实体框架重叠约会

    我将 asp net mvc 与实体框架一起使用 我有一个包含 startat 字段 endat 字段和 roomid 字段 称为 SpaceConfigurationId 的约会列表 并且希望查找给定房间已重复预订的约会列表 可以假设 e

随机推荐