Как я могу сохранить свой Azure WebJob без "Always On"

У меня есть непрерывный веб-сайт, связанный с веб-сайтом, и я запускаю этот веб-сайт в режиме общего доступа. Я не хочу переходить к опции Always On, так как нет реальной потребности в моем приложении. Я только хочу обработать сообщение, когда вызовы сделаны на моем сайте.

Моя проблема заключается в том, что задание продолжает останавливаться через несколько минут, хотя я постоянно вызываю метод манекена на моем веб-сайте каждые 5 минут, который отправляет сообщение в очередь, которая контролируется этим веб-блоком.

Мой webjob - это простое консольное приложение, созданное с использованием SDK WebJob, имеющего такой код, как

JobHost host = new JobHost(new JobHostConfiguration(storageConnictionSttring));
host.RunAndBlock();

и функция обработки сообщений выглядит следующим образом:

public static void ProcessKeepAliveMessages([QueueTrigger("keepalive")] KeepAliveTrigger message)
{
    Console.WriteLine("Keep Alive message called on :{0}", message.MessageTime);
}

В журнале сообщений для задания в основном говорится:

[03/05/2015 18:51:02 > 4660f6: SYS INFO] WebJob is stopping due to website shutting down

Я не против, если так происходит, но когда веб-сайт начинает со следующего вызова, чтобы сохранить жизнь, веб-сайт не запускается. Все сообщения помещаются в очередь, пока я не перейду на панель управления или портал SCM, как показано ниже.

https://mysite.scm.azurewebsites.net/api/continuouswebjobs

Я могу видеть такой статус:

[{"status":"Starting","detailed_status":"4660f6 - Starting\r\n","log_url":"https://mysite.scm.azurewebsites.net/vfs/data/jobs/continuous/WebJobs/job_log.txt","name":"WebJobs","run_command":"mysite.WebJobs.exe","url":"https://mysite.scm.azurewebsites.net/api/continuouswebjobs/WebJobs","extra_info_url":"https://mysite.scm.azurewebsites.net/azurejobs/#/jobs/continuous/WebJobs","type":"continuous","error":null,"using_sdk":true,"settings":{}}]

Я бы очень признателен, если кто-то может помочь мне понять, что здесь происходит не так.

Ответ 1

У меня возникла аналогичная проблема. У меня есть веб-сайт (общий режим) и связанный webjob (непрерывный тип). Глядя на журналы webjob, я обнаружил, что задание переходит в состояние остановки примерно через 15 мин. бездействия и перестает реагировать на запуск сообщений. Представляется противоречащим концепции непрерывной концепции работы, но, судя по всему, для ее бесперебойной работы вы должны подписаться на платный веб-сайт. Ты получаешь то, за что платишь...

Тем не менее, мой сайт должен использоваться только примерно каждые несколько дней, и работа в общем режиме имеет смысл. Я не возражаю, что сайту нужно немного больше времени, чтобы начать работу - при условии, что он перезапустится автоматически. Проблема с webjob заключается в том, что когда-то остановился, он не перезапустится сам по себе. Итак, моя цель состояла в том, чтобы перезапустить его на веб-сайте.

Я заметил, что простой просмотр веб-страницы от Azure Management Portal начинает ее. Следуя этой линии мышления, я обнаружил, что для получения свойств webjob достаточно перевести его в рабочее состояние. Единственный трюк заключается в том, как получить свойства программно, так что перезапуск веб-сайта также перезапустит webjob.

Поскольку вызов для получения свойств webjob должен быть аутентифицирован, первым шагом будет переход на портал Azure Management Portal и загрузка профиля публикации веб-сайта. В профиле публикации вы можете найти учетные данные для аутентификации: имя пользователя (обычно $< имя_сайта > ) и userPWD (хеш пароля). Скопируйте их.

Вот функция, которая получит свойства webjob и разбудит ее (если еще не запущена):

class Program
{
    static void Main(string[] args)
    {
        string websiteName = "<website_name>";
        string webjobName = "<webjob_name>";
        string userName = "<from_publishing_profile>";
        string userPWD = "<from_publishing_profile>";
        string webjobUrl = string.Format("https://{0}.scm.azurewebsites.net/api/continuouswebjobs/{1}", websiteName, webjobName);
        var result = GetWebjobState(webjobUrl, userName, userPWD);
        Console.WriteLine(result);
        Console.ReadKey(true);
    }

    private static JObject GetWebjobState(string webjobUrl, string userName, string userPWD)
    {
        HttpClient client = new HttpClient();
        string auth = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(userName + ':' + userPWD));
        client.DefaultRequestHeaders.Add("authorization", auth);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        var data = client.GetStringAsync(webjobUrl).Result;
        var result = JsonConvert.DeserializeObject(data) as JObject;
        return result;
    }
}

Вы можете использовать аналогичную функцию для получения всех веб-сайтов на своем веб-сайте (используйте конечную точку https://<website_name > .scm.azurewebsites.net/api/webjobs). Вы также можете посмотреть возвращаемый объект JObject, чтобы проверить фактическое состояние веб-темы и других свойств.

Ответ 2

Если вы хотите, чтобы WebJob не останавливался, вам нужно убедиться, что ваш сайт scm жив.

Таким образом, запросы keep-alive должны перейти на https://sitename.scm.azurewebsites.net, и эти запросы должны быть аутентифицированы (базовые auth с использованием учетных данных развертывания).