Azure Web 作业是否能够将任务 运行 保留在后台?
Are Azure Web Jobs capable of keeping the task running in background?
我目前在 Web 作业中遇到 运行 长 HTTP 请求的困难。在本地计算机上启动时,同一应用程序运行良好。因为我已经尝试了多种方法来尝试完成这项工作,所以我现在很好奇这是否可能。
我的测试代码如下:
static void Main(string[] args)
{
/// [...]Getting configuration and using it in "SendPayload"
_stopwatch = new Stopwatch();
_stopwatch.Start();
Task.Run(async () => { await SendPayloadAndAwait(configuration); });
while (_isWaiting)
{
if (_stopwatch.ElapsedMilliseconds % 5000 == 0)
{
Console.WriteLine(".");
}
}
}
public static async Task<string> SendPayloadAndAwait (RequestModel targetRequest)
{
/// [...]Preparing client and payload
Console.WriteLine("Start");
Response= curClient.SendAsync(req).Result;
var endContent = Response.Content.ReadAsStringAsync().Result;
Console.WriteLine("End");
_isWaiting = false;
return "Done";
}
Web 作业控制台永远不会打印“End”,它是“.”的无限(直到超时点)循环。这种情况是否以某种方式被禁止?
您将需要启用“始终开启”设置以确保您的长期 运行 工作不会被终止。
Web 应用程序在 20 分钟不活动后超时,只有对实际 Web 应用程序的请求才会重置此计时器。 Web 作业在单独的进程中异步执行,因此它们不会使 Web 应用保持“清醒”状态。
这里是 note from the web jobs documentation:
A web app can time out after 20 minutes of inactivity. and only requests to the actual web app can reset the timer. Viewing the app's configuration in the Azure portal or making requests to the advanced tools site (https://<app_name>.scm.azurewebsites.net
) doesn't reset the timer. If you set your web app to run continuous or scheduled (timer-trigger) WebJobs, enable the Always on setting on your web app's Azure Configuration page to ensure that the WebJobs run reliably. This feature is available only in the Basic, Standard, and Premium pricing tiers.
我在以前的公司解决的方法是在 Web API 中有一个长期的 运行 工作,它是作为 Azure Functions 实现的
第一次调用(即/api/StartJob)
- 创建一个工作条目(天蓝色table)
- 启动后台线程
- returns 一个 202 [Accepted] 状态和作业条目 Id
后台线程执行长 运行 任务更新作业条目及其进度
客户端循环(完成百分比 < 100)
- 请求状态(即/api/JobStatus)
- 如果完成百分比 = 100 退出循环
如果我们有付费计划,这是非常成功和可靠的
免费计划会在大约 5 分钟后终止会话(按设计)
我目前在 Web 作业中遇到 运行 长 HTTP 请求的困难。在本地计算机上启动时,同一应用程序运行良好。因为我已经尝试了多种方法来尝试完成这项工作,所以我现在很好奇这是否可能。
我的测试代码如下:
static void Main(string[] args)
{
/// [...]Getting configuration and using it in "SendPayload"
_stopwatch = new Stopwatch();
_stopwatch.Start();
Task.Run(async () => { await SendPayloadAndAwait(configuration); });
while (_isWaiting)
{
if (_stopwatch.ElapsedMilliseconds % 5000 == 0)
{
Console.WriteLine(".");
}
}
}
public static async Task<string> SendPayloadAndAwait (RequestModel targetRequest)
{
/// [...]Preparing client and payload
Console.WriteLine("Start");
Response= curClient.SendAsync(req).Result;
var endContent = Response.Content.ReadAsStringAsync().Result;
Console.WriteLine("End");
_isWaiting = false;
return "Done";
}
Web 作业控制台永远不会打印“End”,它是“.”的无限(直到超时点)循环。这种情况是否以某种方式被禁止?
您将需要启用“始终开启”设置以确保您的长期 运行 工作不会被终止。
Web 应用程序在 20 分钟不活动后超时,只有对实际 Web 应用程序的请求才会重置此计时器。 Web 作业在单独的进程中异步执行,因此它们不会使 Web 应用保持“清醒”状态。
这里是 note from the web jobs documentation:
A web app can time out after 20 minutes of inactivity. and only requests to the actual web app can reset the timer. Viewing the app's configuration in the Azure portal or making requests to the advanced tools site (
https://<app_name>.scm.azurewebsites.net
) doesn't reset the timer. If you set your web app to run continuous or scheduled (timer-trigger) WebJobs, enable the Always on setting on your web app's Azure Configuration page to ensure that the WebJobs run reliably. This feature is available only in the Basic, Standard, and Premium pricing tiers.
我在以前的公司解决的方法是在 Web API 中有一个长期的 运行 工作,它是作为 Azure Functions 实现的
第一次调用(即/api/StartJob)
- 创建一个工作条目(天蓝色table)
- 启动后台线程
- returns 一个 202 [Accepted] 状态和作业条目 Id
后台线程执行长 运行 任务更新作业条目及其进度
客户端循环(完成百分比 < 100)
- 请求状态(即/api/JobStatus)
- 如果完成百分比 = 100 退出循环
- 请求状态(即/api/JobStatus)
如果我们有付费计划,这是非常成功和可靠的
免费计划会在大约 5 分钟后终止会话(按设计)