asp.net的Application_Start的一些疑问
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net的Application_Start的一些疑问相关的知识,希望对你有一定的参考价值。
在Global-> Application_Start(object sender, EventArgs e)里设置了一个timer,每隔一分钟就会判断一下当前时间是否到了某个时间,到了的话就启动一个线程去完成一些大数据量更新到库的操作。 现在想问的是:网站上传到空间以后,Application_Start是在什么时候才启动的? 如果没有一个用户打开网页,那Application_Start是不是不会启动了? 那如果在线程正在执行当中(可能要2-3个小时才执行完),这时所有用户都关闭了网站,那这个线程和timer会不会失效不执行了? 望指教!感谢。
简要说明:你iis应用程序池什么时候运行他就什么时候工作。ps:你要的这个功能,实际在iis7.5中才有,asp.net 4+iis7.5允许程序预启动你的代码,也就是即使是iis应用程序池重启,他也会在第一时间内运行你的指定代码(不管用户防问还是没访问,他都会预先加载)
而在iis7.5以下配置你,我个人不建议使用你目前的方式。我们通常自己写window服务,脱离iis环境独立设置更新任务,或者利用系统任务,或者利用sql数据库定时作业去完成这样的要求 参考技术A 1、Application_Start在第一个浏览网站的用户访问时启动;
2、当线程正在执行且没有挂起时,不会因为所有用户退出而停止执行。但当服务器IIS应用程序连接池到达超时时间且没有任务正在执行时,会自动停止。
3、不建议在Application里边执行多线程操作,容易引起内存爆满IIS崩溃。 参考技术B Application_Start在你的应用第一次接收到请求时启动,通常而言也就是第一用户访问你网站的主页时.
如果没有一个用户打开网页,那Application_Start是不是不会启动了?--是的
那如果在线程正在执行当中(可能要2-3个小时才执行完),这时所有用户都关闭了网站,那这个线程和timer会不会失效不执行了?--不会失效,如果没有主动关闭主站(即在IIS中停止),或者网站因内存泄露等问题而崩溃或者主站IIS或Server Down掉,Application_Start事件是不会停止的.如果Application_Start事件因为意外停止了,网站的数据库会回滚到这个DB Batch启动之前的状态的. 重启Application_Start事件后重新跑DB的操作,是不会有问题的. 参考技术C 上传后就启动跟有没有用户访问无关难道说没人访问你的网站就不存在吗?有人访问的时候才存在?根本不是这个逻辑
ASP.NET MVC4 执行流程
MVC在底层和传统的asp.net是一致的,在底层之上,相关流程如下:
1)Global.asax里,MvcApplication对象的Application_Start()事件中,调用 RouteConfig.RegisterRoutes(RouteTable.Routes); 来注册路由规则。
2)RouteConfig.RegisterRoutes()方法里,给出的默认规则为 {controller}/{action}/{id} .
a. 在有特别需要的时候,到这里来修改规则。
b. 未指明Controller默认为HomeContoller,未指定Action默认为Index, 也就是说,直接访问站点时,会默认导航到HomeController下的Index Action.
c. Action后跟的内容会被映射为名为id的参数。 比如: User/Delete/1 会匹配到 UserController的 Delete(int id) 方法。
d. Action分为[HttpGet]和[HttpPost]两种,与HTTP的GET和POST方式对应。 即直接请求的URL只会匹配[HttpGet]方法,而未注明[HttpPost]的方法即默认为[HttpGet]. Post的Action一般会有一个Model参数,MVC会自动将表单里的数据按约定的规则填充到Model实体对象里。 这个约定的规则,就是表单的Name与属性名称有个对应规则。
3)MVC负责按上述规则将执行流程导入合适的Action中,即Controller的某个方法中。
4)Action中,可以直接返回字符串,输出到浏览器, 也可以返回到ActionResult对象, 该对象指向一个View页面,并且附带了一些属性作为传递数据的容器。
ActionResult通常通过调用Controller对象的View(…)方法得到,也可以通过Redirect()方法或RedirectToAction()方法得到, 不过后面两种方法主要用于跳转到其它Controller,因为后面的方法不能传递Model对象。 Action向View传递数据,可以通过Model、ViewBag或ViewData三种容器,其中Model是强类型的,所以是最优先的方式。
5)View中,会先执行本身,再执行模板页和子页, 但是执行顺序和页面内容的输出顺序并不一致。模板中后输出的内容可以在页面中先输出的内容的前面.
在View中,需要提交数据,或跳转页面里,均会通过Route导向某个Controller的Action。 View中向Action中传递数据,其最终原理是通过http的GET和POST等方式(含AJAX的), POST方式会通过上面提到的约定规则,将表单中的数据填充到Model参数对象中。 在Action中,可以访问通过参数传递进来的Model对象,也可以访问原始的Request对象中的QueryString参数或Form集合, 当然Model对象是优先的方式。
以上是关于asp.net的Application_Start的一些疑问的主要内容,如果未能解决你的问题,请参考以下文章
IoC - WindsorContainer - Application_Start 后的 Asp.Net null
Asp.Net Mvc - 将事物存储在在 Application_Start 中重新初始化的静态变量中是不是安全
如果 ASP.NET 应用程序在本地运行,请在 Global.Asax - Application_Start 中查找
ASP.NET MVC:如何在 Global.asax.cs 中的 Application_Start() 中检测浏览器宽度
关于asp.net Global.asax 我在 Application_Start有个定时器、每5分钟执行一次、一段时间后不执行了。