我们有一个asp.net网络应用程序,其中“Always on”正在运行一项长期任务。为避免同时运行此任务两次或多次,在任务开始时,将标志设置为数据库。如果强制关闭此任务,则不会删除该标志,并且如果没有人工干预,该任务将无法再次运行。
我一直在寻找Azure中是否存在回收网站的概念,我没有找到太多相关信息。我发现例如https://stackoverflow.com/a/21841469/1081568它似乎从未被执行回收,但我发现有些人抱怨网络应用程序的“永远在线”设置随机回收。
我想知道应用程序可以在Azure中循环/关闭的情况?只是为了维护? Azure回收asp.net网络应用程序?或者是一个独立于内部部署服务器的概念?
另一个问题是,有没有办法从Azure捕获此关闭/回收,并在运行时正常停止我的运行任务。
由于
答案 0 :(得分:2)
据我所知,如果您使用“永远在线”设置网络应用,通常azure不会回收您的网络应用资源。
如果网络应用程序的“始终开启”设置已关闭,则表示网站将在一段时间不活动(20分钟)后回收。
另一个问题是,有没有办法从Azure捕获此关闭/回收,并在运行时正常停止我的运行任务。
根据您的描述,我建议您发送一份kudu restapi请求以获取当前的网络应用程序的processid。
如果应用程序重新启动,则会更改processid。通过比较processid,您可以捕获此Web应用程序被回收。
有关如何获取当前Web应用程序的processid的更多详细信息,请参阅以下步骤:
1.在您的azure Web应用程序中设置部署凭据,如下所示:
注意:记住用户名和密码,我们将使用它们来生成访问令牌
2.将请求发送到以下网址以获取流程信息。
网址:https://yourwebsitename.scm.azurewebsites.net/api/processes
代码示例:
string url = @"https://yourwebsitename.scm.azurewebsites.net/api/processes";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = "GET";
httpWebRequest.ContentLength = 0;
string logininforation = "username:password";
byte[] byt = System.Text.Encoding.UTF8.GetBytes(logininforation);
string encode = Convert.ToBase64String(byt);
httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, "Basic " + encode);
using (HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse())
{
using (System.IO.StreamReader r = new System.IO.StreamReader(response.GetResponseStream()))
{
string jsonResponse = r.ReadToEnd();
dynamic result = JsonConvert.DeserializeObject(jsonResponse);
dynamic resultList = result.Children();
foreach (var item in resultList)
{
Console.WriteLine(item.name + " : " + item.id);
}
}
}
结果:
您还可以在门户网站中找到processid。
选择您的网络应用 - >进程资源管理器