【问题标题】:When a Asp.net Web App is recycled in Azure?当一个 Asp.net Web App 在 Azure 中被回收?
【发布时间】:2017-06-01 12:31:03
【问题描述】:

我们有一个“始终开启”的 asp.net Web 应用程序正在运行一个长时间的任务。为避免同时运行此任务两次或更多次,在任务开始时将标志设置为数据库。如果此任务被强制关闭,则该标志不会被删除,并且该任务不会在没有人工干预的情况下再次运行。

我一直在寻找Azure中是否存在回收网站的概念,我没有找到太多关于它的信息。例如,我发现 https://stackoverflow.com/a/21841469/1081568 似乎永远不会被回收执行,但我发现有些人抱怨网络应用程序设置为“始终开启”随机回收。

我想知道在什么情况下可以在 Azure 中回收/关闭应用程序?只是为了保养? Azure 回收 asp.net 网络应用程序?还是本地服务器独有的概念?

还有一个问题,有没有办法从 Azure 捕获这个关闭/回收,并在它正在运行时优雅地停止我正在运行的任务。

谢谢

【问题讨论】:

  • 如果回收它是个问题,那么不要把它放在 Web 应用程序中。它属于其他更稳定的地方。
  • @Mason 完全同意,但我问这个也是出于好奇。了解回收在 Azure 中的工作原理(如果存在此概念)。

标签: asp.net azure azure-web-app-service


【解决方案1】:

据我所知,如果您将网络应用设置为“始终开启”,Azure 通常不会回收您的网络应用的资源。

如果网络应用程序的“始终开启”设置为关闭,这意味着网站将在闲置一段时间(20 分钟)后被回收。

还有一个问题,有没有办法从 Azure 捕获此关闭/回收,并在它正在运行时优雅地停止我正在运行的任务。

根据您的描述,我建议您可以发送一个 kudu restapi 请求来获取当前 web 应用程序的 processid。

如果应用程序重新启动,则 processid 将被更改。通过比较processid,你可以捕捉到这个web app被回收了。

更多关于如何获取当前web应用的processid,可以参考以下步骤:

1.在您的 azure Web 应用程序中设置部署凭据,如下所示:

注意:记住用户名和密码,我们将使用它们来生成访问令牌

2.发送请求到下面的url获取进程信息。

网址: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。

选择您的网络应用 --> 进程浏览器

图片:

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多