ASP MVC 5让网站活跃起来

时间:2016-08-17 08:34:58

标签: asp.net-mvc webclient ping job-scheduling keep-alive

目前我有工作要检查并每分钟发送一次电子邮件。我使用hangfire作为作业调度程序,但它要求站点保持活动才能正常运行。为了解决这个问题,我正在使用另一个每5分钟运行一次的工作,以使网站保持活力:

 public static bool Ping()
 {
        try
        {
             var request = (HttpWebRequest)WebRequest.Create('http://xyz.domain.com');
            request.Timeout = 3000;
            request.AllowAutoRedirect = false; // find out if this site is up and don't follow a redirector
            request.Method = "HEAD";

            using (request.GetResponse())
            {
                return true;
            }
        }
        catch
        {
            return false;
        }
}

除了使用Windows服务或任务计划程序之外,是否有人知道更好或更有效的方法使网站保持活力?

2 个答案:

答案 0 :(得分:1)

在上周出于同样的目的,我使用了Azure Scheduler。我认为这是一个非常好的工具,你可以:

  • 安排工作,
  • 诽谤诉讼
  • 可以访问您计划任务的历史记录

因此,如果您有MSDN订阅,我认为值得考虑。

答案 1 :(得分:0)

正如您所注意到的,应用程序池回收或应用程序不活动将导致重复任务和延迟作业停止排队,并且不会处理排队作业。

如果您正在托管“内部部署”应用程序,则可以使用Windows Server 2008 R2(或更高版本)附带的“自动启动”功能 - 运行IIS 7.5(或更高版本)

Hangfire文档中提供了完整的设置说明 - http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html

我将在下面总结。

<强> 1)
创建一个实现IProcessHostPreloadClient

的类
public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient
{
    public void Preload(string[] parameters)
    {
        HangfireBootstrapper.Instance.Start();
    }
}

<强> 2)
更新您的global.asax.cs

public class Global : HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        //note - we haven't yet created HangfireBootstrapper
        HangfireBootstrapper.Instance.Start();
    }

    protected void Application_End(object sender, EventArgs e)
    {
        HangfireBootstrapper.Instance.Stop();
    }
}

第3)
创建上面提到的HangfireBootstrapper类。

public class HangfireBootstrapper : IRegisteredObject
{
    public static readonly HangfireBootstrapper Instance = new HangfireBootstrapper();

    private readonly object _lockObject = new object();
    private bool _started;

    private BackgroundJobServer _backgroundJobServer;

    private HangfireBootstrapper()
    {
    }

    public void Start()
    {
        lock (_lockObject)
        {
            if (_started) return;
            _started = true;

            HostingEnvironment.RegisterObject(this);

            GlobalConfiguration.Configuration
                .UseSqlServerStorage("connection string");
                // Specify other options here

            _backgroundJobServer = new BackgroundJobServer();
        }
    }

    public void Stop()
    {
        lock (_lockObject)
        {
            if (_backgroundJobServer != null)
            {
                _backgroundJobServer.Dispose();
            }

            HostingEnvironment.UnregisterObject(this);
        }
    }

    void IRegisteredObject.Stop(bool immediate)
    {
        Stop();
    }
}

<强> 4)
启用服务自动启动

  

创建上述类后,您应该编辑全局   applicationHost.config文件   (%WINDIR%\ System32下\ INETSRV \设置\的applicationHost.config)。首先你   需要将应用程序池的启动模式更改为   AlwaysRunning,然后启用Service AutoStart Providers。

<applicationPools>
    <add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

<!-- ... -->

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true"
                              serviceAutoStartProvider="ApplicationPreload" />
    </site>
</sites>

<!-- Just AFTER closing the `sites` element AND AFTER `webLimits` tag -->
<serviceAutoStartProviders>
    <add name="ApplicationPreload" type="WebApplication1.ApplicationPreload, WebApplication1" />
</serviceAutoStartProviders>
  

请注意,对于最后一个条目,WebApplication1.ApplicationPreload是   应用程序中实现的类的全名   IProcessHostPreloadClient和WebApplication1是您的名称   应用程序库。你可以在这里阅读更多相关信息。

     

当应用程序池没有时,不需要将IdleTimeout设置为零   启动模式设置为AlwaysRunning,空闲超时不起作用   了。