Asp.net 如何在长时间运行的方法执行期间避免超时

Asp.net 如何在长时间运行的方法执行期间避免超时,asp.net,.net,asp.net-mvc,asp.net-mvc-5,hangfire,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 5,Hangfire,我正在开发一个部署在IIS-8中的asp.net mvc 5 web应用程序,我的应用程序中有一个方法来执行一个长时间运行的任务,主要是扫描我们的网络中的服务器和虚拟机,并用扫描结果更新数据库。方法执行可能会持续30-40分钟才能在生产环境中完成。我正在使用一个名为Hangfire的计划工具,它每天调用这个方法2次 下面是startup.cs文件中的作业定义,它将在8:01 am和8:01 pm调用该方法:- public void Configuration(IAppBuilder app)

我正在开发一个部署在IIS-8中的asp.net mvc 5 web应用程序,我的应用程序中有一个方法来执行一个长时间运行的任务,主要是扫描我们的网络中的服务器和虚拟机,并用扫描结果更新数据库。方法执行可能会持续30-40分钟才能在生产环境中完成。我正在使用一个名为Hangfire的计划工具,它每天调用这个方法2次

下面是startup.cs文件中的作业定义,它将在
8:01 am
8:01 pm
调用该方法:-

public void Configuration(IAppBuilder app)
{
    var options = new SqlServerStorageOptions
    {
        PrepareSchemaIfNecessary = false
    };
    GlobalConfiguration.Configuration.UseSqlServerStorage("scanservice",options);

    RecurringJob.AddOrUpdate(() => ss.Scan(), "01 8,20 ***");
}
下面是schedule工具每天调用两次的方法:-

public void Scan()
{
    Service ss = new Service();
    ss.NetworkScan().Wait();
}
最后,进行实际扫描的方法是(我只提供了该方法将执行的高级描述):-

公共异步任务网络扫描()
{
//从数据库中检索服务器信息
//在所有服务器上循环,然后执行一些powershell命令扫描网络并逐个检索每个服务器的信息。。。
//在为每个服务器完成shell命令后,我将更新数据库中的相关服务器信息

目前我在我们的测试环境中做了一些测试,每件事情都很顺利,扫描2台测试服务器大约需要25秒。但现在我们计划将应用程序转移到生产环境中,我们需要扫描大约120+服务器。因此我估计在生产环境中完成方法执行大约需要30-40分钟所以我的问题是如何确保这个执行永远不会过期,以及ScanNetwork()方法将一直完成到结束?

您不必担心任务超时,也许可以为每台服务器启动一个新任务。这样,每个任务都将非常短暂,扫描单个服务器引起的任何异常都不会影响所有其他服务器。此外,如果您的应用程序在IIS中重新启动尚未完成的扫描将被恢复。由于所有扫描都在一个连续任务中进行,这是不可能的。您可能还会看到完成整个网络扫描的总时间大幅下降,因为大部分时间可能会花在等待远程服务器上

public void Scan()
{
    Service ss = new Service();
    foreach (var server in ss.GetServers())
    {
        BackgroundJob.Enqueue<Service>(s => s.ServerScan(server));
    }
}
公共作废扫描()
{
服务ss=新服务();
foreach(ss.GetServers()中的var server)
{
BackgroundJob.Enqueue(s=>s.ServerScan(server));
}
}

现在,您的计划任务只需为每台服务器排队一个新任务。

是否应该在完成任务之前运行,或者遇到错误导致任务提前返回?您为什么担心该方法会超时?它应该在方法完成或遇到问题并结束之前运行。我不相信某个方法有时间限制。默认tim应用程序池的out设置为20分钟。您可以从使用的应用程序池的高级设置中进行更改。windows服务可能更适合此设置,因此您不必担心超时。见鬼,您可以在控制台应用程序中进行更改,也可以从任务计划程序中运行。Dylan是对的。如果您在Web服务器上下文中运行类似的内容-不要这样做。如果网站必须启动类似的操作,请创建端点应用程序并从web应用程序启动它。看起来您的网站甚至不监视反馈。如果您的网站监视扫描的输出,只需在某个位置写入更新并使网站定期抓取。或者使用SignalR进行反馈并增加
SqlServerOptions.InvisibilityTimeout
(默认为30分钟),或者只更新到Hangfire 1.5.0(我删除了该超时),以防止其他工作人员在超时后获取相同的后台作业。
public void Scan()
{
    Service ss = new Service();
    foreach (var server in ss.GetServers())
    {
        BackgroundJob.Enqueue<Service>(s => s.ServerScan(server));
    }
}