【问题标题】:Long lasting http post not returning in Azure Webjob持久的 http 帖子未在 Azure Webjob 中返回
【发布时间】:2017-04-22 03:28:38
【问题描述】:

我正在构建一个 Azure Webjob,它将数据从我的 blob 存储发布到在我的客户端环境上运行的其他(非天蓝色)Web 服务。 此 http-POST 的处理可能需要很长时间(最多至少 30 分钟),这很好,因为没有用户在等待此过程完成。

经过一天的谷歌搜索和测试,我的测试看起来像这样。

  • Webservice有一个测试方法,等待10分钟后返回。
  • Azure Webjob 将使用 System.Net.Http.HttpClient 调用测试方法,Timeout 设置为 11 分钟。
  • 在父 Azure Web 应用中,ApplicationSettings 下,Always On 设置为 true,应用设置 WEBJOBS_IDLE_TIMEOUT 设置为 3600
  • 当 Azure Webjob 等待时,它将每秒执行一次Console.WriteLine("Heartbeat")(以解决空闲 cpu 时间)。

这将导致System.Threading.Tasks.TaskCanceledException: A task was canceled. 当我从 Visual Studio 运行相同的测试时,它会在等待 10 分钟后成功完成。

我错过了什么吗?怎么回事?

编辑:包括我的测试代码,以及异常和堆栈跟踪。

private static async Task<String> AzureWebJobTest()
{
    var url = "[MyUrl]";
    var json = new StringContent("[MyValidJSON]", Encoding.UTF8, "application/json");

    var client = new HttpClient();
    client.Timeout = TimeSpan.FromMinutes(11);
    return await (await client.PostAsync(url, json)).Content.ReadAsStringAsync();
}

以及这个函数抛出的异常:

System.Threading.Tasks.TaskCanceledException: A task was canceled.
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at [MyProjectNamespace].Program.<AzureWebJobTest>d__5.MoveNext() in [MyLocalPath]\Program.cs:line 100

【问题讨论】:

  • 您是否尝试过在您的 Azure Web 应用程序中增加 SCM_COMMAND_IDLE_TIMEOUT?
  • 您好@iikkoo,感谢您的建议,但不幸的是它没有奏效。结果相同
  • 你能发布完整的异常和跟踪吗?
  • 您是否尝试减少Webservice返回值的等待时间并检查是否会出现相同的问题?另外,持续WebJobs支持Remote debugging feature,请尝试调试代码找到导致错误的代码sn-p。
  • @fred-han-msft,我已经尝试了您的建议并创建了一个连续的 WebJob 并连接了远程调试器。我已经验证确实是client.PostAsync 引发了异常。此外,当我将 Web 服务的延迟降低到 3 分钟或更短时,不会引发异常。

标签: c# azure timeout http-post azure-webjobs


【解决方案1】:

我怀疑请求的 230 秒超时限制会导致问题。正如 David Ebbo 在this thread 中所说:

对于未发回任何数据的请求,有 230 秒(即略少于 4 分钟)超时。之后,客户端得到你看到的 500,即使实际上请求被允许继续服务器端。

【讨论】:

  • 确实 Fred,这似乎是问题所在。我会回答以展示我的工作。
【解决方案2】:

为了解决这个问题,我在我的网络服务上创建了一些请求管理。它跟踪使用System.ServiceModel.Dispatcher.IDispatchMessageInspector 开始和结束的每个请求。现在可以通过新的网络服务检索这些请求的状态。

结果:

Azure Webjob 启动长时请求,当耗时超过 230 秒时,它会捕获超时异常,并使用新的 Web 服务不断检查原始(长时)请求的状态,直到完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多