如何从Quartz.NET作业获取网站的根URL?

时间:2017-03-28 16:25:29

标签: asp.net quartz.net

我正在ASP.NET Web项目中使用Quartz.NET实现调度程序。该网站纯粹是为了容纳一些构成WPF桌面应用程序后端的WCF服务。因此,只有桌面应用程序的用户处于活动状态时,该网站才会处于活动状态。这意味着网站应用程序很可能在夜间关闭。但是,我希望调度程序始终保持运行。

请注意,由于我们的托管,使用Windows服务不是一种选择,即使这似乎是整体上最好的选择。我坚持像Quartz.NET这样的东西(据我所知)。

在阅读有关此内容的同时,我看到很多建议使用每19分钟调用一次网站页面的预定作业,以避免20分钟的超时。第一个问题是,这是最好的方法吗?

如果是,那么我有第二个问题。我见过的所有示例都显示了一个硬编码的URL,我想避免这种情况。理想情况下,我希望在代码中选择URL,以便在Visual Studio中运行时,它将选择并调用localhost URL,并在部署时,它将获取实时URL。

我知道我可以将URL放在web.config文件中,并在部署时使用转换将其更改为实时URL,但我想知道是否有更好的方法来执行此操作。

2 个答案:

答案 0 :(得分: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.

以上网址,我是从下面得到的。

由于您无法编写Windows服务,请查看此URL。它有一些选择。

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

答案 1 :(得分:0)

我想到答案很简单。作业本身对Web上下文一无所知,但包含的应用程序确实如此。

我需要做的就是为ping网站的作业添加一个静态字符串属性...

public static string WebSiteRootUrl = "";

...然后在ASP.NET Web项目的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);
      }
    }

由于Request对象在应用程序启动时不可用,我必须在Application_BeginRequest中执行此操作,这意味着a)每次发出请求时都会触发它; b){{1}返回的URL将包括所请求资源的完整路径,而不仅仅是所需的根URL。

为了解决第一个问题,我只设置HttpContext.Current.Request.Url.AbsoluteUri如果尚未设置(即是一个空字符串)这将是第一个请求。我不认为这实际上是没有检查的问题,因为它很快就不会引起任何问题,但这是一个简单的检查,所以值得包括以防万一。

至于第二个问题,我利用了一个事实,即URL将在方案和域之间包含两个正斜杠,然后在域和(可选)端口之后包含第三个斜杠。因为我们只使用http或https作为方案,幻数8在双斜杠后启动IndexOf()搜索,这意味着我们返回根URL。

希望这有助于某人。