Application_Start在Global和IProcessHostPreloadClient中

时间:2014-08-15 11:03:28

标签: c# asp.net asp.net-mvc iis quartz.net

我正在尝试按照http://weblogs.asp.net/scottgu/auto-start-asp-net-applications-vs-2010-and-net-4-0-series在我的asp.net应用程序中实现一些启动过程。

截至目前,我们在ASP.Net application_start方法中注册了一个quartz.net调度程序,如下所示并运行。

public static class QuartzHelper
{
 public static void RunJob()
 {
  ISchedulerFactory schedFact = new StdSchedulerFactory();
    IScheduler sched = schedFact.GetScheduler();
    sched.Start();
    IJobDetail job = JobBuilder.Create<SendDailyMorningSMSJob>()
    .WithIdentity("Auto_DailyMorning8AM", "AutoSMS")
    .Build();
    ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("SMS_Trigger", "AutoSMS")
    .WithSchedule(CronScheduleBuilder
    .DailyAtHourAndMinute(08,00)
    .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time")))
    .Build();
     sched.ScheduleJob(job, trigger);
  }
}

然后

protected void Application_Start()
{
   QuartzHelper.RunJob();
}

问题是,当IIS正在回收应用程序池时,它会停止运行。为了使它工作,我试图遵循这种方法。

public class PreWarmUp : IProcessHostPreloadClient
{
  public void Preload(string[] parameters)
  {
    QuartzHelper.RunJob();
  }
}

在ApplicationHost.config中

 <serviceAutoStartProviders>

  <add
    name="MCVApplicationNamespace"
    type="MCVApplicationNamespace.QuartzHelper, QuartzHelper" />
 </serviceAutoStartProviders>

但我读了MSDN

  

此接口主要供WCF应用程序使用   是非HTTP应用程序。想要预加载的ASP.NET开发人员   ASP.NET Web应用程序应该在IIS中使用模拟的HTTP请求   7.0与Global.asax文件中的Application_Start方法结合使用。

现在感到困惑, 我是否需要在PreWarmUp类和Application_Start中使用相同的代码?

3 个答案:

答案 0 :(得分:1)

你应该看看Hangfire。它是如何从IIS应用程序执行计划任务的一个很好的示例。

这是一个执行“即发即弃”,“延迟”和“重复”任务的框架,可以从可选的仪表板进行管理。

但是,如果你不使用它,你可以从中学到很多东西documentation

答案 1 :(得分:1)

您应该在配置中提供PreWarmUp课程:

public class PreWarmUp : IProcessHostPreloadClient
{
  public void Preload(string[] parameters)
  {
    QuartzHelper.RunJob();
  }
}

在ApplicationHost.config中

 <serviceAutoStartProviders>
  <add name="PreWarmUp"
    type="NameSpace1.WhateverYourNameSpace.PreWarmUp, AssemblyName1" />
 </serviceAutoStartProviders>

然后,在您的网站设置中,您需要提及使用此服务按名称使用。但最好像脚本一样(Powershell):

Add-PSSnapin WebAdministration -ErrorAction SilentlyContinue
Import-Module WebAdministration -ErrorAction SilentlyContinue

$ApplicationPreloadType = "NameSpace1.WhateverYourNameSpace.PreWarmUp, AssemblyName1"
$ApplicationPreloadProvider = "PreWarmUp"
$WebSiteFullName = "IIS:\Sites\myWebApp"

Set-WebConfiguration -Filter '/system.applicationHost/serviceAutoStartProviders' -Value (@{name=$ApplicationPreloadProvider;type=$ApplicationPreloadType})
Set-ItemProperty $WebSiteFullName -Name applicationDefaults.serviceAutoStartEnabled -Value True
Set-ItemProperty $WebSiteFullName -Name applicationDefaults.serviceAutoStartProvider -Value $ApplicationPreloadProvider

答案 2 :(得分:0)

这不起作用。您要求Web应用程序像服务一样运行。如果您有任何长时间运行的任务,您将始终遇到应用程序池回收,如果您不这样做,我怀疑您打开了一个非常长时间运行的应用程序池设置,这将削弱您的服务器&#39;表现远离。

我的建议:停止使用Web应用程序来处理Windows服务的目的。或者,编写一个任务调度程序,调用一个网页,在您需要的时间间隔内执行上述操作。这实质上就是许多PHP应用程序和cron用于通过Web应用程序模拟服务的方式。