如果没有“我如何保持Azure WebJob运行?”;“永远在线”;

如果没有“我如何保持Azure WebJob运行?”;“永远在线”;,azure,azure-web-app-service,azure-webjobs,azure-webjobssdk,Azure,Azure Web App Service,Azure Webjobs,Azure Webjobssdk,我有一个与某个网站相关的连续webjob,我正在共享模式下运行该网站。我不想选择“始终在线”,因为我的应用程序没有真正的需要。我只想在打电话到我的网站时处理邮件 我的问题是,即使我每5分钟在我的网站上不断调用一个虚拟的keep-alive方法,将消息发布到该webjob监视的队列中,作业在几分钟后仍会停止 My webjob是一个使用webjob SDK构建的简单控制台应用程序,其代码如下 JobHost host = new JobHost(new JobHostConfiguration(s

我有一个与某个网站相关的连续webjob,我正在共享模式下运行该网站。我不想选择“始终在线”,因为我的应用程序没有真正的需要。我只想在打电话到我的网站时处理邮件

我的问题是,即使我每5分钟在我的网站上不断调用一个虚拟的keep-alive方法,将消息发布到该webjob监视的队列中,作业在几分钟后仍会停止

My 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
我不介意这种情况发生,但当网站开始下一次呼叫保持活动时,webjob不会启动。所有消息都将排队,直到我转到管理仪表板或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":{}}]

如果有人能帮助我了解这里的问题,我将不胜感激。

如果您希望WebJob不会停止,您需要确保您的scm站点处于活动状态


因此,保持活动状态请求应该转到,并且这些请求需要进行身份验证(使用部署凭据进行基本身份验证)。

我遇到了类似的问题。我有一个网站(共享模式)和一个相关的webjob(连续类型)。查看webjob日志,我发现该作业在大约15分钟的不活动后进入停止状态,并停止对触发消息的反应。这似乎与持续工作的概念相矛盾,但显然,要让它真正持续运行,你必须订阅付费网站。一分钱一分货。。。 这就是说,我的网站只需要每隔几天使用一次,在共享模式下运行非常有意义。我不介意网站需要额外的时间来启动——只要它能自动重启。webjob的问题是,一旦停止,它将无法自行重新启动。所以,我的目标是重新启动网站。 我注意到,只需从Azure管理门户查看webjob即可启动它。按照这种思路,我发现获取webjob属性就足以将其切换到运行状态。唯一的技巧是如何以编程方式获取属性,这样重新启动网站也将重新启动webjob。 因为获取webjob属性的调用必须经过身份验证,所以第一步是转到Azure管理门户并下载网站发布配置文件。在发布配置文件中,您可以找到身份验证凭据:username(通常为$)和userPWD(密码哈希)。把它们抄下来。 下面是一个函数,它将获取webjob属性并将其唤醒(如果尚未运行):

类程序
{
静态void Main(字符串[]参数)
{
字符串websiteName=“”;
字符串webjobName=“”;
字符串userName=“”;
字符串userPWD=“”;
string webjobUrl=string.Format(“https://{0}.scm.azurewebsites.net/api/continuouswebjobs/{1}”,websiteName,webjobName);
var result=GetWebjobState(webjobUrl、用户名、userPWD);
控制台写入线(结果);
Console.ReadKey(true);
}
私有静态JObject GetWebjobState(字符串webjobUrl、字符串用户名、字符串userPWD)
{
HttpClient=新的HttpClient();
string auth=“Basic”+Convert.ToBase64String(Encoding.UTF8.GetBytes(userName+”:“+userPWD));
client.DefaultRequestHeaders.Add(“授权”,auth);
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
var data=client.GetStringAsync(webjobUrl).Result;
var result=JsonConvert.DeserializeObject(数据)作为作业对象;
返回结果;
}
}

您可以使用类似的函数获取网站中的所有WebJob(使用endpoint)。您还可以查看返回的JObject,以验证webjob和其他属性的实际状态。

我的印象是,当站点被激活时,我们的作业将启动,这就是我在文档中看到的。不是这样吗?不是,WebJob是在scm(kudu)站点下运行的,除非启用“始终打开”,否则该站点在站点启动时不会启动。是否有方法触发作业从我的WebApi代码中启动?@AmitApple您似乎必须转到,而不是转到。如果,像我一样,您通过VisualStudio进行了部署,它为您生成了一个您没有的部署密码,您需要在这里看到这个答案:谢谢!这种方法对我很有帮助。我也曾使用pingdom对SCM进行ping,这也起到了作用,但这看起来有点太麻烦了。您可以使用WebJob Api手动触发作业。
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;
    }
}