c# - Global 和 IProcessHostPreloadClient 中的 Application_Start

标签 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

This interface is intended primarily for use by WCF applications that are non-HTTP applications. ASP.NET developers who want to preload ASP.NET Web applications should use the simulated HTTP requests in IIS 7.0 combined with the Application_Start method in the Global.asax file.

现在很困惑,我是否需要在 PreWarmUp 类中以及 Application_Start 中使用相同的代码?

最佳答案

您应该在配置中提供您的 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

关于c# - Global 和 IProcessHostPreloadClient 中的 Application_Start,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25325323/

相关文章:

asp.net - 如何停止每次发布时创建新的 'Temporary ASP.NET Files' 哈希值?

asp.net - 如何在不创建新 PDF 的情况下更新 PDF?

asp.net-mvc - ASP.Net MVC 中的两步验证

c# - 如何在 ASP.NET MVC 4 中默认防止 CSRF?

C# 范围和 GC : Is outer reference-type object guaranteed to remain valid after assigned to inner object in nested "using" scope?

javascript - 如何在立即使用 jQuery 或 JavaScript 粘贴时删除所有空格?

c# - 找不到类型或命名空间名称 'function'?

jQuery 自动完成滚动下拉菜单

asp.net-mvc - 模型未在 POST 上正确提交/绑定(bind)

c# - 这两个中哪个是正确的术语 : Named parameters or Named arguments?