文档章节

阻止Application_End事件的解决方案

Yamazaki
 Yamazaki
发布于 2015/07/08 17:33
字数 987
阅读 37
收藏 0

在做项目时,遇到同步ERP数据的问题,客户要求是:程序中,设置一个开始时间,再设置一个时间间隔,让程序每隔一段时间导出销售记录,这个开始时间和时间间隔可以手动修改设定。
    
这问题纠缠了我好几天,总算解决了,写文档记录: 

    首先,要让程序定时执行任务,可以使用ASP.NET中的Timer计时,不过这个定时不是很准,如果用它,还会遇到其他的问题,后面会提到。第二种方法是,使用一个叫做:Quartz.NET开源项目,专门用来调度定时作业。

这次项目中,我用到的就是Quartz.NET组件,用他来定时调度作业,是很方便,不过问题也来了:当程序运行一段时间后,发现自动任务停止了。在网上查了查资料,说法不一。   

    后来多方查资料以及自己试验证明:原来是网站应用程序在没有请求时,过一定的时间就会停止应用程序,具体点来说,就是网站中的最后一个session结束时,网站应用程序就会结束。当然就会触发Application_End事件。随之定时任务也会停掉。
     
现在的问题就是:如何让网站都有请求?如何让Application_End事件不会发生?

这个问题在网上也有很多种说法,比如有人建议:在Application_End中用程序模拟请求网站,重新开始Application_Start事件,也给出了程序代码:http://asdfblog.com/technology/aspnet-scheduled-tasks-with-quartznet.html这里有详细说明。不过我照博主的做法,并没有实现我想要的功能。不过他是用来处理IIS应用程序池回收的问题的。
     
孟子E章说:新建一个独立的线程来调度执行的任务,个人认为比较麻烦,没采用这种方式。

    最后,发现了一个简单的处理方式,利用ASP.NET的缓存超时技术。下面具体来阐明,基本思路:

在应用程序启动时,用程序缓存一个网站中的页面。在缓存网页时,设置好缓存过期时间,以及缓存过期时触发的回调事件,缓存过期时触发的回调事件这是关键。在缓存过期时用程序模拟请求网站页面,再次缓存,循环之

 

代码说明:(全在Global.asax里)

private const string DummyPageUrl = "http:/index.aspx";  
    private const string DummyCacheItemKey = "GagaGuguGigi";  
    Quartz.IScheduler sched = SingletonScheduler.GetIntance();  
    void Application_Start(object sender, EventArgs e)  
    {        
        //缓存页面  
        RegisterCacheEntry();  
    }  
      
    // 注册一缓存条目在5分钟内到期,到期后触发的调事件  
     private void RegisterCacheEntry()  
    {  
        if (null != HttpContext.Current.Cache[DummyCacheItemKey]) return;  
        HttpContext.Current.Cache.Add(DummyCacheItemKey, "Test", null, DateTime.MaxValue,  
            TimeSpan.FromMinutes(5), CacheItemPriority.NotRemovable,  
            new CacheItemRemovedCallback(CacheItemRemovedCallback));  
    }  
      
    // 缓存项过期时程序模拟点击页面,阻止应用程序结束  
     public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)  
    {        
        HitPage();  
    }  
      
    // 模拟点击网站网页  
     private void HitPage()  
    {  
        System.Net.WebClient client = new System.Net.WebClient();  
        client.DownloadData(DummyPageUrl);   
    }      
    protected void Application_BeginRequest(Object sender, EventArgs e)  
    {  
        if (HttpContext.Current.Request.Url.ToString() == DummyPageUrl)  
        {  
            RegisterCacheEntry();  
        }  
    }



这样,网站应用程序就可以像运行windows服务一样,在后台默默的执行了,没看明白,可以参见这里:http://www.codeproject.com/KB/aspnet/ASPNETService.aspx
附:Quartz.Net详细教程参见:
①官方教程:
http://quartznet.sourceforge.net/tutorial/index.html;
②中文翻译:http://www.cnblogs.com/shanyou/category/102991.html


 ====================================2013-8-2  后记================================================

在WebForm中使用Quartz.Net组件,个人测试结果,感觉也不够稳定,最终是由 Winform客户端程序+Quartz.NET组件实现,程序一直放在服务器上跑着。

为了防止服务器端程序停掉,可以写成windows服务,这样服务器一启动,就会执行任务,只要服务器没停,程序也会一直运行。

当然,这只能适用于独立主机,虚拟空间就不行了。

附:

1.如何编写windows服务:

http://msdn.microsoft.com/zh-cn/library/vstudio/9k985bc9.aspx

http://www.cnblogs.com/tuyile006/archive/2006/11/27/573654.html

2.windows服务辅助类:http://blog.csdn.net/a497785609/article/details/9103129


本文转载自:http://blog.csdn.net/a497785609/article/details/5941283

Yamazaki
粉丝 61
博文 677
码字总数 38622
作品 0
普陀
高级程序员
私信 提问
BUG:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值

BUG:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值 症状: 如果您使用的Response.End、 Response.Redirect或Server.Transfer方法,则ThreadAbortException会发生异常...

warhax
2017/07/03
0
0
Oracle 触发器 操作 郏高阳

1:编写一个数据库触发器以显示当任何时候雇员加薪时的情况,而薪水减少时不需要任何提示 例如:当薪水增加时,输出“薪水已增加”字样,同时输出更新前后的薪水值 CREATE OR REPLACE TRIGGE...

郏高阳
2011/09/07
0
0
C# 程序针对指定错误号的异常进行拦截处理

今天工作中遇到了一个场景:前台调用后台通信接口时,如果出现错误会抛出异常。这里的异常信息格式为“[错误号] 错误信息”。现要针对指定的错误号做特殊处理。 处理逻辑需要放在主程序集中,...

北风其凉
2016/06/15
36
0
安全问题一,关于表单映射model属性传递(mass assignment)方面的疑虑?

引子: 今天(现在零点,实际应该是昨天了)中午看一点ruby on rails方面的东西,准确说,ruby只是刚安装了敲了个puts、def,on rails则看没见到影子了。 说重点,巧了看到mass assignment问题...

bs2004
2012/03/31
1K
3
检测点击react组件外部的事件

在写popover组件的时候,需要捕获当前组件外部的点击事件,而react本身没有提供这一块的api,怎么解决呢,在网上找了资料,答题解决方案 如此。 看了以上这几种解决方案之后,觉得都不是很优...

Yard
2017/09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ngrok 外网映射工具

ngrok介绍 许多刚学java web的同学(包括我自己)肯定都非常好奇,如何在外网上访问自己做的项目,跟我们本地访问tomcat有什么区别? 今天就向大家介绍一个非常强大的外网映射工具:ngrok.ngrok可以...

edison_kwok
50分钟前
2
0
Spark Streaming的优化之路——从Receiver到Direct模式

          作者:个推数据研发工程师 学长 1 业务背景 随着大数据的快速发展,业务场景越来越复杂,离线式的批处理框架MapReduce已经不能满足业务,大量的场景需要实时的数据处理结果来...

个推
今天
4
0
壮丽70年·奋斗新时代|蒸妙集团熏蒸中会阴熏蒸的神奇好处

聚结相合之处为会。会阴居两阴间,为督、任、冲三脉的起点,三脉背出两阴之间,会聚阴部,因名会阴。会阴,经穴名。出《针灸甲乙经》。会阴别名屏翳、下极、金门。属任脉。在会阴部,男性当阴...

公益传承
今天
2
0
pentaho-kettle-8.2.0.0-R源码开发环境搭建

1.从Kettle官网下载源码,本文使用的是pentaho-kettle-8.2.0.0-R 下载地址:https://codeload.github.com/pentaho/pentaho-kettle/zip/8.2.0.0-R 2.打开eclipse,选择一个新的工作空间,然后设...

gq_2010
今天
1
0
lua web快速开发指南(7) - 高效的接口调用 - httpc库

httpc库基于cf框架都内部实现的socket编写的http client库. httpc库内置SSL支持, 在不使用代理的情况下就可以请求第三方接口. httpc支持header、args、body、timeout请求设置, 完美支持各种h...

水果糖的小铺子
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部