首页 新闻 会员 周边

iis7 Global.asax Application_Start未执行

0
悬赏园豆:50 [已解决问题] 解决于 2014-07-31 16:31

本地没问题,发布到服务器上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);
            } 
        }
Global.asax.cs
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;
        }
    }
}
TimerClass

服务器线程池站点模式原来是集成模式,现在改为经典模式
iis7重启,线程池重启,程序编译后发布,发布前将原文件删除,还是不行。

Global.asax根本没有执行。

造梦者2013的主页 造梦者2013 | 初学一级 | 园豆:166
提问于:2013-12-10 13:32
< >
分享
最佳答案
1

Application_Start在iis重启后不立即执行,只有系统被第一次访问后,也就是request之后才执行Application_Start方法

收获园豆:30
业余程序猿 | 菜鸟二级 |园豆:232 | 2014-01-18 15:40
其他回答(2)
0

那你在集成模式下能执行吗

收获园豆:10
Albert Fei | 园豆:2102 (老鸟四级) | 2013-12-10 14:16

不可以

支持(0) 反对(0) 造梦者2013 | 园豆:166 (初学一级) | 2013-12-10 14:38

@造梦者2013: 那有没有报错?

支持(0) 反对(0) Albert Fei | 园豆:2102 (老鸟四级) | 2013-12-10 16:36
0

你是如何知道没有执行的?

收获园豆:10
Launcher | 园豆:45045 (高人七级) | 2013-12-10 15:08

执行的内容就是设置超期的单据状态, 如果他执行的话,我单据的状态应该变化。我查数据库是没变的。

支持(0) 反对(0) 造梦者2013 | 园豆:166 (初学一级) | 2013-12-10 15:10

我在想是代码的问题,还是iis的问题。在iis6上运行没问题。

支持(0) 反对(0) 造梦者2013 | 园豆:166 (初学一级) | 2013-12-10 15:11

@造梦者2013: 我们不是测试人员,我们是程序员,“设置超期的单据状态”和“Global.asax根本没有执行”是有区别的。

首先,你要确认访问第一次访问网站时, Application_Start 一定会被调用,如果它没有被调用,这个时候你才能去找 Asp.Net ,应用程序池,甚至 IIS 的问题。

其次,你要确认下面的语句正确执行:

TimerPlan.InitPlan();
TimerPlan timer = TimerPlan.StartTimerPlan();

如果正确执行,那么你需要确认你的 timer 是否被过早的回收了。

最后,上面都通过了,你就需要检查你的 CheckTimePlan 方法是否有执行正确。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2013-12-10 15:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册