我正在为ASP.NET Core 2.1正常关机。
我注意到,在正常关机开始时,所有正在Controller上运行的请求都将被取消。
即使我希望在处理容器之前成功完成所有请求。
根据IApplicationLifetime https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.iapplicationlifetime?view=aspnetcore-2.1
ApplicationStopping在应用程序主机执行时触发
正常关机。请求可能仍在进行中。关机将
阻止,直到此事件完成。
我该怎么办才能防止在我所有当前请求完成之前进行处理?
例:
public static void Main(string[] args) {
WebHostExtensions.Run(BuildWebHost(args));
}
private static IWebHost BuildWebHost(string[] args) {
return WebHostExtensions.CreateDefaultBuilder(args)
.UseSerilog()
.UseStartup<Startup>()
.UseUrls("http://0.0.0.0:9100")
.Build();
}
控制器:
public class UserOrdersController : Controller
{
public async Task<IActionResult> GetUserOrders(string productId)
{
await Task.Delay(5000);
Console.WriteLine("Finished");
//.....................................
}
}
因此,如果我要求执行正常关机,则不会打印“完成”。
UPD:
向构建器添加了
.UseShutdownTimeout(TimeSpan.FromSeconds(10))
,但没有帮助。 最佳答案
就像其他人提到的那样,您期望的行为应该开箱即用。 SIGINT应该触发正常关机。我感觉您正在通过运行比Web主机的默认关机超时值更长的Task.Delay进行测试。这将导致超时触发,这将终止所有当前正在运行的请求。
设置Web主机关闭超时,如下所示:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseShutdownTimeout(TimeSpan.FromSeconds(60)) // set timeout value here
.UseStartup<Startup>();
}
}
关于c# - 正常关机和当前正在处理的请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51482858/