Как сохранить работоспособность веб-задания Azure без сообщения "Всегда включено"

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

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

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

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":{}}]

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

2 ответа

Решение

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

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

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

Поскольку вызов для получения свойств веб-задания должен проходить проверку подлинности, первым делом необходимо перейти на портал управления Azure и загрузить профиль публикации веб-сайта. В профиле публикации вы можете найти учетные данные для аутентификации: имя пользователя (обычно $ <имя_сайта>) и 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: // <имя_сайта>.scm.azurewebsites.net / api / webjobs). Вы также можете посмотреть на возвращенный объект JObject, чтобы проверить фактическое состояние веб-задания и другие свойства.

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

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

Другие вопросы по тегам