2017-03-28 19 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。

希望这可以帮助别人。