2011-11-18 53 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

那麼,該事件不依賴於要求的有效方法。只要有一個請求啓動了'應用程序',它就會在後臺繼續運行。即使網站上沒有人,緩存項目也可能會過期。該事件將觸發。 –