我有一个ASP.NET窗体应用程序,允许用户运行一些管理报告。一些报告需要按照计划无人值守运行,并且我创建了一个C#控制台应用程序以在服务器上的任务计划程序中运行它们。这些力量坚信,有一个基于网络的应用程序可以完成这一切。作为调度程序的网页?
您如何可靠地从一个Web应用程序按日程安排运行作业,比如说每天下午11:00,?我将Quartz.net视为调度程序的一个选项,但是如何让网页全天候运行?
感谢
我有一个ASP.NET窗体应用程序,允许用户运行一些管理报告。一些报告需要按照计划无人值守运行,并且我创建了一个C#控制台应用程序以在服务器上的任务计划程序中运行它们。这些力量坚信,有一个基于网络的应用程序可以完成这一切。作为调度程序的网页?
您如何可靠地从一个Web应用程序按日程安排运行作业,比如说每天下午11:00,?我将Quartz.net视为调度程序的一个选项,但是如何让网页全天候运行?
感谢
不管是什么是说的权力,你不应该依赖于一个ASP.NET应用程序是一个调度。在后端有一个专用服务,用于从ASP.NET Web应用程序写入的共享数据库(直接或通过数据层)检索计划,并生成报告。
这种方法
避免可靠性问题:IIS工作进程可能在 随时回收 - 你将不得不考虑的是它增加了复杂性。
限制了可能的安全限制:您必须将某些 权限添加到IIS AppPool身份以允许产生这些 进程。尽可能限制权限以减少攻击面。
虽然我当然同意这不是个好主意,但他的问题其实不是“我应该吗?”而是“他们让我,我怎么......” –
@Christopher Estep答案是你实际上不能。当时的权力可能会要求他编程一个时间机器,它不会改变响应,这是不可行的。 –
也许我错误地问过,是否有办法让一个代码库生成报告,充当网页并按计划吐出报告?任务管理器可以在只写入批处理报告的模式下启动它?我知道这很奇怪,但我试图保持开放的态度。 – GBrookman
你拿如意路线:
写了需要无人值守运行到的HttpHandler
然后写一个定期的目标服务的服务报告。
然后你说,“看到我满足你的要求,所有的报告都像你问的那样在asp.net网页中运行。” - 你只是增加了一些额外的东西= P
方面的意见:你应该尝试和证明为什么他们的要求是不现实的。
从Web应用程序运行计划任务不会有任何意义。创建在服务器上运行的服务,或者通过任务计划程序安排任务以特定间隔运行。
这里听起来不太明显,但谁建议通过Web应用程序来完成这件事显然不了解该技术的局限性。
您可以让IIS保持24x7的应用程序池而不会有太多麻烦 - 只需禁用超时和自动回收。然后像石英可以工作。
也就是说,你的管理层没有什么意义,我会试着寻找他们为什么要在一个应用程序中做到这一点,并开始以合理的方式打倒异议。
感谢,如果我不能说我的出路这个我会 – GBrookman
虽然这样做在网站上是不理想的或推荐..这是可能的,因为该网站是总是运行。
下面是一个示例: 我在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);
}
}
这种运作良好,如果你的计划任务快。如果这是一个漫长的过程..你一定要保持它出你的网络应用程序。
我已经没有任何问题,或用此方法抛出奇怪的错误。
你意识到上面的例子是完全依赖于一个请求,右试试这个?没有任何保证会提出请求。 –
是否符合要求http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/ – Tom
那么,该事件不依赖于要求的有效方法。只要有一个请求启动了'应用程序',它就会在后台继续运行。即使网站上没有人,缓存项目也可能会过期。该事件将触发。 –
您是否尝试过这些服务? http://www.onlinecronservices.com/ – Kizz
@Kizz感谢,看起来像cron是用于Linux,我在Windows IIS – GBrookman
服务上市也有在线服务。意味着它们本身就是平台不可知的。 – Kizz