2011-11-18 56 views
1

我有一个ASP.NET窗体应用程序,允许用户运行一些管理报告。一些报告需要按照计划无人值守运行,并且我创建了一个C#控制台应用程序以在服务器上的任务计划程序中运行它们。这些力量坚信,有一个基于网络的应用程序可以完成这一切。作为调度程序的网页?

您如何可靠地从一个Web应用程序按日程安排运行作业,比如说每天下午11:00,?我将Quartz.net视为调度程序的一个选项,但是如何让网页全天候运行?

感谢

+1

您是否尝试过这些服务? http://www.onlinecronservices.com/ – Kizz

+0

@Kizz感谢,看起来像cron是用于Linux,我在Windows IIS – GBrookman

+2

服务上市也有在线服务。意味着它们本身就是平台不可知的。 – Kizz

回答

4

不管是什么是说的权力,你不应该依赖于一个ASP.NET应用程序是一个调度。在后端有一个专用服务,用于从ASP.NET Web应用程序写入的共享数据库(直接或通过数据层)检索计划,并生成报告。

这种方法

  • 避免可靠性问题:IIS工作进程可能在 随时回收 - 你将不得不考虑的是它增加了复杂性。

  • 限制了可能的安全限制:您必须将某些 权限添加到IIS AppPool身份以允许产生这些 进程。尽可能限制权限以减少攻击面。

+0

虽然我当然同意这不是个好主意,但他的问题其实不是“我应该吗?”而是“他们让我,我怎么......” –

+2

@Christopher Estep答案是你实际上不能。当时的权力可能会要求他编程一个时间机器,它不会改变响应,这是不可行的。 –

+0

也许我错误地问过,是否有办法让一个代码库生成报告,充当网页并按计划吐出报告?任务管理器可以在只写入批处理报告的模式下启动它?我知道这很奇怪,但我试图保持开放的态度。 – GBrookman

2

你拿如意路线:

写了需要无人值守运行到的HttpHandler

然后写一个定期的目标服务的服务报告。

然后你说,“看到我满足你的要求,所有的报告都像你问的那样在asp.net网页中运行。” - 你只是增加了一些额外的东西= P

方面的意见:你应该尝试和证明为什么他们的要求是不现实的。

4

从Web应用程序运行计划任务不会有任何意义。创建在服务器上运行的服务,或者通过任务计划程序安排任务以特定间隔运行。

这里听起来不太明显,但谁建议通过Web应用程序来完成这件事显然不了解该技术的局限性。

+0

可惜我不能投你不止一次;-) –

+0

@DavidePiras:这是算数:) –

+0

詹姆斯的想法,我觉得你的职位是什么,我会与管理层分享。简洁,礼貌,感谢 – GBrookman

2

您可以让IIS保持24x7的应用程序池而不会有太多麻烦 - 只需禁用超时和自动回收。然后像石英可以工作。

也就是说,你的管理层没有什么意义,我会试着寻找他们为什么要在一个应用程序中做到这一点,并开始以合理的方式打倒异议。

+0

感谢,如果我不能说我的出路这个我会 – GBrookman

2

虽然这样做在网站上是不理想的或推荐..这是可能的,因为该网站是总是运行。

下面是一个示例: 我在global.asax中创建了一个Cache项目,并且过期。 当它到期时,会触发一个事件。您可以运行报告或OnRemove()事件中的任何内容。

然后你可以设置为一个页面(最好是非常小的一个),将在的Application_BeginRequest将加回缓存项与到期触发代码的调用。

Global.asax的

private const string VendorNotificationCacheKey = "VendorNotification"; 

    protected void Application_Start(object sender, EventArgs e) 
    { 

    //Set value in cache with expiration time 
    CacheItemRemovedCallback callback = OnRemove; 
    //Expire after 15 minutes 
    Context.Cache.Add(VendorNotificationCacheKey, DateTime.Now, null, DateTime.Now.AddMinutes(15), TimeSpan.Zero, 
         CacheItemPriority.Normal, callback); 
    } 

    private void OnRemove(string key, object value, CacheItemRemovedReason reason) 
    { 
     SendVendorNotification(); 

     //Need Access to HTTPContext so cache can be re-added, so let's call a page. Application_BeginRequest will re-add the cache. 
     var siteUrl = ConfigurationManager.AppSettings.Get("SiteUrl"); 
     var client = new WebClient(); 
     client.DownloadData(siteUrl + "default.aspx"); 
     client.Dispose(); 

    } 

    private void SendVendorNotification() 
    { 
     //Do Tasks here 
    } 

    protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     //Re-add if it doesn't exist 
     if (HttpContext.Current.Request.Url.ToString().ToLower().Contains("default.aspx") && 
      HttpContext.Current.Cache[VendorNotificationCacheKey] == null) 
     { 
      //ReAdd 
      CacheItemRemovedCallback callback = OnRemove; 
      Context.Cache.Add(VendorNotificationCacheKey, DateTime.Now, null, DateTime.Now.AddMinutes(15), TimeSpan.Zero, 
           CacheItemPriority.Normal, callback); 
     } 
    } 

这种运作良好,如果你的计划任务快。如果这是一个漫长的过程..你一定要保持它你的网络应用程序。

我已经没有任何问题,或用此方法抛出奇怪的错误。

+0

你意识到上面的例子是完全依赖于一个请求,右试试这个?没有任何保证会提出请求。 –

+0

是否符合要求http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/ – Tom

+1

那么,该事件不依赖于要求的有效方法。只要有一个请求启动了'应用程序',它就会在后台继续运行。即使网站上没有人,缓存项目也可能会过期。该事件将触发。 –