Как сохранить работоспособность веб-задания 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/, и эти запросы должны быть аутентифицированы (обычная аутентификация с использованием ваших учетных данных для развертывания).