我正在尝试按照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中使用相同的代码?
答案 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应用程序模拟服务的方式。