本地没问题,发布到服务器上Application_Start没有执行
本地计算机:iis6
服务器计算机:iis7 window server standard系统
我的Global.asax执行的主要任务是一个定时器,定时执行数据统计;
代码如下:
protected void Application_Start(object sender, EventArgs e) { try { TimerPlan.InitPlan(); TimerPlan timer = TimerPlan.StartTimerPlan(); //TimerPlan.ActionPlanThread(); } catch (Exception ex) { TimerPlan.WriteErrorMsg("初始化定时器异常,异常内容为:" + ex.Message); } }
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Timers; using System.IO; using Ciap.MasterData; using System.Collections.Generic; using Ciap.Web.PublicClass; using Ciap.Business.Internal; using System.Threading; using System.Reflection; namespace Ciap.Web.TimerClass { public class TimerPlan : System.Timers.Timer { private static readonly object lockforinstance = new object(); private static List<Plan> plans = new List<Plan>(); /*计划内容*/ /***************************** * 1.每隔360day初始化该年六日 * 2.每隔1小时统计审核信息并提示管理员审核 * 3.单据流转到下一环节状态清除 * 4.将错误或异常消息记录到txt文档 * ********************************/ public static TimerPlan StartTimerPlan() { TimerPlan timer; lock (lockforinstance) { ////任务1:初始化设定日期 timer = new TimerPlan(); timer.Interval = 6000 ; timer.Elapsed += new ElapsedEventHandler(CheckTimePlan); timer.AutoReset = true; timer.Enabled = true; } return timer; } static void CheckTimePlan(object sender, ElapsedEventArgs e) { //暂停定时器 TimerPlan timer = sender as TimerPlan; timer.Stop(); //执行计划 plans.ForEach(p => { if (p.PlanStartDate.CompareTo(DateTime.Now) < 0) { //执行计划 if (p.ActionPlan()) p.PlanStartDate = p.PlanStartDate.Add(p.PlanTimeSpan);//执行成功重新设定下次执行时间 } }); //重新开始定时器 timer.Start(); } public static void InitializeHoliday() { // do something WriteErrorMsg("初始化" + initDate.ToShortDateString() + "假日"); } public static void CheckInfoStatistics() { // do something WriteErrorMsg("系统执行方法CheckInfoStatistics "); } public static void InitPlan() { Plan plan = new Plan(); plan.PlanName = "初始化设定日期 360天执行一次"; plan.PlanStartDate = DateTime.Now; plan.PlanTimeSpan = new TimeSpan(360, 0, 0, 0, 0); plan.PlanEvent = "InitializeHoliday"; plan.PlanEventClassName = "Ciap.Web.TimerClass.TimerPlan,Ciap.Web"; plans.Add(plan); plan = new Plan(); plan.PlanName = "定时统计审核信息"; plan.PlanStartDate = DateTime.Now; plan.PlanTimeSpan = new TimeSpan(1, 0, 0); plan.PlanEvent = "CheckInfoStatistics"; plan.PlanEventClassName = "Ciap.Web.TimerClass.TimerPlan,Ciap.Web"; plans.Add(plan); } /// <summary> /// 将错误内容写入到PlanErrorMsg文档 /// </summary> /// <param name="Msg">错误消息</param> public static void WriteErrorMsg(string Msg) { StreamWriter sw1 = new StreamWriter("Ciap.Web/PlanErrorMsg.txt", true); string message = Msg + " 执行时间:" + DateTime.Now; sw1.WriteLine(message); sw1.Close(); TimeSpan ts = new TimeSpan(1, 0, 0, 0); } } public class Plan { /// <summary> /// 计划名称 /// </summary> private string planName; /// <summary> /// 计划名称 /// </summary> public string PlanName { get { return planName; } set { planName = value; } } /// <summary> /// 要执行事件的类名,程序集名(如:Ciap.Web.TimerClass.TimerPlan,Ciap.Web) /// </summary> private string planEventClassName; /// <summary> /// 要执行事件的类名,程序集名(如:Ciap.Web.TimerClass.TimerPlan,Ciap.Web) /// </summary> public string PlanEventClassName { get { return planEventClassName; } set { planEventClassName = value; } } /// <summary> /// 计划执行事件 /// </summary> private string planEvent; /// <summary> /// 计划执行事件 /// </summary> public string PlanEvent { get { return planEvent; } set { planEvent = value; } } /// <summary> /// 计划下次执行时间,每次执行完,根据时间间隔重新设定 /// </summary> private DateTime planStartDate; /// <summary> /// 计划下次执行时间,每次执行完,根据时间间隔重新设定 /// </summary> public DateTime PlanStartDate { get { return planStartDate; } set { planStartDate = value; } } /// <summary> /// 计划执行时间间隔(几天,几小时) /// </summary> private TimeSpan planTimeSpan; /// <summary> /// 计划执行时间间隔(几天,几小时) /// </summary> public TimeSpan PlanTimeSpan { get { return planTimeSpan; } set { planTimeSpan = value; } } /// <summary> /// 执行方法,重新设定时间(一般方式,适用于方法少) /// </summary> private void ActionPlanLocal() { //if (planEvent == "InitializeHoliday") TimerPlan.InitializeHoliday(); //else TimerPlan.InitializeCheckInfo(); } /// <summary> /// 执行计划,并设定下次执行的时间 成功返回true;失败返回false /// </summary> public bool ActionPlan() { try { //执行设定的方法 if (string.IsNullOrEmpty(planEventClassName) || planEventClassName.Split(',').Count() < 2) { TimerPlan.WriteErrorMsg("在ActionPlan方法中Plan.planEventClassName格式不对" + planEventClassName); return false; } Type type = GetClassType(planEventClassName.Split(',')[0], planEventClassName.Split(',')[1]); if (type == null) { TimerPlan.WriteErrorMsg("Plan.ActionPlan方法执行过程中获取type为空,planEventClassName值为" + planEventClassName); return false; } type.InvokeMember(this.planEvent, BindingFlags.InvokeMethod, null, null, null); return true; } catch (Exception ex) { TimerPlan.WriteErrorMsg("Plan.ActionPlan执行计划出现异常!异常信息" + ex.Message); return false; } } /// <summary> /// 获取类型 /// </summary> /// <param name="className">类名</param> /// <param name="assembly">程序集名</param> /// <returns>类型Type</returns> public static Type GetClassType(string className, string assembly) { int commaPos = className.IndexOf(","); if (commaPos > 0) { string temp = className; className = temp.Substring(0, commaPos); assembly = temp.Substring(commaPos + 1); } string relativePath = AppDomain.CurrentDomain.BaseDirectory + @"bin/"; string asmName = assembly.Replace("\\", ""); string fp = relativePath + "\\" + assembly + ".dll"; if (File.Exists(fp)) { Assembly asm = Assembly.LoadFrom(fp); Type t = asm.GetType(className); return t; } else return null; } } }
服务器线程池站点模式原来是集成模式,现在改为经典模式
iis7重启,线程池重启,程序编译后发布,发布前将原文件删除,还是不行。
Global.asax根本没有执行。
Application_Start在iis重启后不立即执行,只有系统被第一次访问后,也就是request之后才执行Application_Start方法
那你在集成模式下能执行吗
不可以
@造梦者2013: 那有没有报错?
你是如何知道没有执行的?
执行的内容就是设置超期的单据状态, 如果他执行的话,我单据的状态应该变化。我查数据库是没变的。
我在想是代码的问题,还是iis的问题。在iis6上运行没问题。
@造梦者2013: 我们不是测试人员,我们是程序员,“设置超期的单据状态”和“Global.asax根本没有执行”是有区别的。
首先,你要确认访问第一次访问网站时, Application_Start 一定会被调用,如果它没有被调用,这个时候你才能去找 Asp.Net ,应用程序池,甚至 IIS 的问题。
其次,你要确认下面的语句正确执行:
TimerPlan.InitPlan();
TimerPlan timer = TimerPlan.StartTimerPlan();
如果正确执行,那么你需要确认你的 timer 是否被过早的回收了。
最后,上面都通过了,你就需要检查你的 CheckTimePlan 方法是否有执行正确。