请教各位大哥。我做了一个利用Global.asax定时批量生成静态页的程序。但是怎么调试在本地IIS里运行是可以生成的,但是上传到服务器上就无法生成了。不知道是什么原因,请各位帮帮忙。
注:
 1. 服务器有读写权限。
 2. 网上所说的Global.asax不执行是因为WEB站点里有PrecompiledApp.config  文件。该文件我已经删除了。源代码如下:  void BuildStaticPagesTimer_Callback(object state)
    {
        string s = DateTime.Now.ToShortTimeString();
        if (DateTime.Now.ToShortTimeString() == "5:00")
        {
            //每日早晨5:00生成聚合页面
            Build(0, 0);
        }
        
    }
    void Build(int parentId, int depth)
    {
        //在这里写生成静态页面的代码 
        using (ISession session = NHibernateSession.Session)
        {
            IList list = boardDao.SelectClass(session, parentId);
            foreach (Uupo_BoardInfo board in list)
            {
                if (Convert.ToInt32(artDao.RecordCount_WithBoard(session, board.Board_id)[0]) > 0)
                {
                    try
                    {
                        readFileHtml("http://www.abc.com/RSS.aspx?id=" + board.Board_id); //通过地址读取内容
                        ConvertPage("http://www.abc.com/RSS.aspx?id=" + board.Board_id, "RSS\\RSS_" + board.Board_id + ".xml");
                    }
                    catch(Exception ex)
                    {
                        File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + "LogInfo.txt", DateTime.Now.ToString() + " ," + ex.Message + "\r");
                    }
                }
                Build(board.Board_id, depth + 1);
            }
        }
        
    }
    /// <summary>
    /// 生成页面
    /// </summary>
    /// <param name="sourceUrl">原URL地址</param>
    /// <param name="convertUrl">生成相对路径地址</param>
    /// <param name="strInfo">生成反馈信息</param>
    private void ConvertPage(string sourceUrl, string convertUrl)
    {
       
        filestream = new FileStream( AppDomain.CurrentDomain.BaseDirectory + convertUrl, FileMode.Create);
        Bt = System.Text.Encoding.Default.GetBytes(strIndexHtml);
        filestream.Write(Bt, 0, Bt.Length);
        if (filestream != null) filestream.Close();
    }    /// <summary>
    /// 读取HTML文件
    /// </summary>
    /// <param name="sourceUrl"></param>
    private void readFileHtml(string sourceUrl) { strIndexHtml = UupoSystem.Web.RemoteSave.GetRemoteHtml(sourceUrl); }
  void Application_Error(object sender, EventArgs e) 
    { 
        // 在出现未处理的错误时运行的代码
        //下面的代码是关键,可解决IIS应用程序池自动回收的问题
        Thread.Sleep(1000);
        //这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start
        //string url = "http://www.abc.com/manage_ment/admin_login.aspx";
        string url = "http://www.abc.com/manage_ment/admin_login.aspx";
        HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
        Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流
        //////////////////////////////////////写入日志文件///////////////////////////////////////////
        File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + "LogInfo.txt", DateTime.Now.ToString() + " ,执行 Application_Error \r");    }    void Session_Start(object sender, EventArgs e) 
    {
        // 在新会话启动时运行的代码
        if (BuildStaticPagesTimer == null)
        {
            lock (locker)
            {
                if (BuildStaticPagesTimer == null)
                {
                    BuildStaticPagesTimer = new System.Threading.Timer(BuildStaticPagesTimer_Callback, locker, 0, 1 * 60 * 1000);
                }
            }
        }     }

解决方案 »

  1.   

    1,查看AppDomain.CurrentDomain.BaseDirectory + convertUrl路径是否正确,
    2,System.Threading.Timer可能会停止的,网站20分钟内没人访问会自动停止的,因此你必须在System.Threading.Timer里面自己访问网站,
    3,查看事件查看器里面的错误记录,可能权限问题或者代码出错了
      

  2.   

    Global.asax没执行?解决的方法是:
    把cs代码和Global.asax写在一个文件里面
      

  3.   

    可使用ajax timer定时访问网站
    静态页面
    protected override void Render(HtmlTextWriter writer) {   
      StreamWriter r=new StreamWriter(Server.MapPath(""), false,System.Text.Encoding.UTF8);   
      HtmlTextWriter h=new HtmlTextWriter(r);   
      base.Render(h);   
      r.Close();   
      h.Close();   
      }   
     StringWriter wr = new StringWriter();
     Server.Execute("", wr);   
     this.lit.Text = Server.HtmlEncode(wr.ToString());
     File.WriteAllText(Server.MapPath(""), wr.ToString()); 
    log4net记录日志
    是否执行了代码
      

  4.   

    Application_BeginRequest 就是当有请求过来时就会触发的啊。如果你是使用WebSite那么编译以后要连同新编译的页面一同发布,dll与页面要同步才行。WebApplicaion就直接把dll考过去就可以用了!
    代码从global.asax.cs里移到global.asax里,不要global.asax.cs 
      

  5.   

    我是在void Session_Start(object sender, EventArgs e)   回话产生时执行的代码,并且System.Threading.Timer有页面的访问,代码是写在Global.asax文件里的。在本地测试没有问题,在服务器上就不行了。
      

  6.   

    事件不执行Global.asax没执行?解决的方法是:
    把cs代码和Global.asax写在一个文件里面
      

  7.   

    谢谢呀。我用的VS2005 ,本身cs代码和Global.asax 就在一个文件里呀。VS2003才是分开的。
      

  8.   

    我在本地测试是执行的,说明Global.asax是执行了
      

  9.   

    IIS编译是按照页面编译,而要运行Global.asax需要整个网站编译。如果页面编译通过而网站编译未通过,则Global.asax里面的代码无法加载。而网站是正常运行的,没有任何报错,如果访问到问题页面才会报错。这应该是IIS一个不合理的地方。
      

  10.   

    最新情况,我启用了trace跟踪。在服务器上Global.asax根本没执行,是什么原因呀
      

  11.   

    timer肯定能搞定,但最好还是写个服务来搞
      

  12.   

    我是用Timer了问题是Global.asax没执行呀
      

  13.   

    global是可以定时执行的,只是在使用Timer时,会遇到一些问题,就是Timer在定时生成文件时,会被服务器拒绝写入磁盘。可以使用Thread创建定时器来解决问题