2017-03-28 45 views
0

我正在ASP.NET Web項目中使用Quartz.NET實現調度器。該網站純粹是爲了容納一些構成WPF桌面應用程序後端的WCF服務。因此,只有當桌面應用程序的用戶處於活動狀態時,該網站纔會處於活動狀態。這意味着網站應用程序很可能在夜間關閉。但是,我希望調度程序始終保持運行狀態。如何從Quartz.NET作業獲取網站的根URL?

請注意,由於我們的託管,使用Windows服務不是一個選項,即使這似乎是整體上最好的選擇。我堅持Quartz.NET之類的東西(據我所知)。

在閱讀這些內容時,我看到很多建議使用計劃作業每19分鐘在網站上調用一個頁面,以避免20分鐘超時。第一個問題是,這是做這件事的最好方法嗎?

如果是,那麼我有第二個問題。我所看到的所有例子都顯示了一個硬編碼的URL,我想避免它。理想情況下,我希望URL以代碼的形式提供,這樣當在Visual Studio中運行時,它將接收並調用URL,並在部署時選擇活動的URL。

我知道我可以將URL放在web.config文件中,並在部署時使用轉換將其更改爲實時URL,但我想知道是否有更好的方法來完成此操作。

回答

0

這傢伙似乎認爲它好:

https://www.mikesdotnetting.com/article/254/scheduled-tasks-in-asp-net-with-quartz-net

我會在這裏貼頭款,如果上面的鏈接死亡。那麼未來的讀者會有一些具體的信息來搜索。

A perennial question on the ASP.NET forums concerns how to schedule regular tasks as part of a web application. Typically, the requirement is to send emails once every 24 hours at a particular time each day, but it could actually be anything from tweeting on a schedule to performing maintenance tasks. Equally typically, half a dozen members on the forum dive in with recommendations to install Windows Services or schedule batch files with the Task Scheduler - regardless of the fact that most web site owners are not afforded such privileges as part of their shared hosting plan. 

上面的URL,我從下面得到。

既然你不能寫一個Windows服務,那麼看看這個URL。它有一些選擇。

https://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

+0

感謝您的答覆,但我不知道怎麼回答我的問題。第一個環節是,當我開始與我Quartz.NET使用的主要原因之一,是一個偉大的介紹,但不包括我的問題。至於第二個環節,這是一種很好的閱讀方式(就像他以往一樣),但是再次回答不了我的問題。它提供了設置預定作業的各種選項,但我們已經致力於Quartz.NET,我們不想現在切換。這並不是說交換會有所幫助,因爲我們仍然不得不尋找該網站持有調度的根URL的同樣的問題。你什麼意思? –

0

它發生,我認爲答案很簡單。作業本身並不知道任何有關Web上下文的知識,但包含的應用程序卻可以。

所有我需要做的是一個靜態的字符串屬性添加到執行ping網站的工作...

public static string WebSiteRootUrl = ""; 

...然後在ASP.NET網頁的Global.asax.cs中項目,我做了以下...

protected void Application_BeginRequest(object sender, EventArgs e) { 
     if (KeepWebSiteAliveJob.WebSiteRootUrl == "") { 
     string uri = HttpContext.Current.Request.Url.AbsoluteUri; 
     KeepWebSiteAliveJob.WebSiteRootUrl = uri.Substring(0, uri.IndexOf("/", 8) + 1); 
     } 
    } 

作爲請求對象不可用的應用程序啓動時,我不得不這樣做在的Application_BeginRequest,這意味着一個),它會被解僱每次請求和b)由HttpContext.Current.Request.Url.AbsoluteUri返回的URL將包括請求的完整路徑資源,而不僅僅是所需的根URL。

爲了解決第一個問題,我只設置了KeepWebSiteAliveJob.WebSiteRootUrl如果尚未設置(即,是一個空字符串)這將在第一個請求上。如果沒有這張支票,我認爲這不會是個問題,因爲它太快了,不太可能導致任何問題,但這是一個簡單的檢查,所以值得包括以防萬一。

至於第二個問題,我注意到的事實,即一個網址將包含方案和域,然後在域之後的第三和(可選)端口之間的兩個正斜槓。由於我們只使用HTTP或HTTPS的方案中,雙斜槓之後的幻數8的開始的IndexOf()搜索,這意味着我們回到了根URL。

希望這可以幫助別人。