ASP.NET核心重启多个实例
ASP.NET Core restart multiple instances
我发现了一种以编程方式重新启动 ASP.NET 核心应用程序的非常有趣的方法。
public class Program
{
private static CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run(cancelTokenSource.Token);
}
public static void Shutdown()
{
cancelTokenSource.Cancel();
}
}
然后在控制器中:
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Restart()
{
Program.Shutdown();
return RedirectToAction("Index", "Home", null);
}
}
效果很好。这实际上会关闭该应用程序,但下一个对应用程序的请求将启动它。
现在,当我安装了多个实例(例如在 Azure 中)时,我将如何实现相同的目标?
一种方法是从 Azure 获取所有实例的列表,并使用实例端点 IP 地址而不是主机名对每个实例进行单独的 HTTP 调用。不幸的是,不知道如何在 Azure 中完全做到这一点,但在亚马逊云中我们使用 AmazonEC2Client.DescribeInstances 请求,应该有类似的东西。
另一种方法是使用消息队列。所以每个实例都应该订阅主题并在收到消息时重新启动。
我发现了一种以编程方式重新启动 ASP.NET 核心应用程序的非常有趣的方法。
public class Program
{
private static CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
host.Run(cancelTokenSource.Token);
}
public static void Shutdown()
{
cancelTokenSource.Cancel();
}
}
然后在控制器中:
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Restart()
{
Program.Shutdown();
return RedirectToAction("Index", "Home", null);
}
}
效果很好。这实际上会关闭该应用程序,但下一个对应用程序的请求将启动它。
现在,当我安装了多个实例(例如在 Azure 中)时,我将如何实现相同的目标?
一种方法是从 Azure 获取所有实例的列表,并使用实例端点 IP 地址而不是主机名对每个实例进行单独的 HTTP 调用。不幸的是,不知道如何在 Azure 中完全做到这一点,但在亚马逊云中我们使用 AmazonEC2Client.DescribeInstances 请求,应该有类似的东西。
另一种方法是使用消息队列。所以每个实例都应该订阅主题并在收到消息时重新启动。