簡體   English   中英

持久的http發布未在Azure Webjob中返回

[英]Long lasting http post not returning in Azure Webjob

我正在構建一個Azure Webjob,它將把我的Blob存儲中的數據發布到我的在客戶端環境中運行的其他(非Azure)Web服務中。 此http-POST的處理可能會花費很長時間(至少30分鍾),這很好,因為沒有用戶在等待此過程完成。

經過谷歌搜索和測試一天后,我的測試如下所示。

  • Webservice有一個測試方法,等待10分鍾后返回。
  • Azure Webjob將使用System.Net.Http.HttpClient並將Timeout設置為11分鍾來調用測試方法。
  • 在父Azure Web App的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分鍾后成功完成。

我想念什么嗎? 這是怎么回事?

編輯:包括我測試中的代碼,以及異常和stacktrace。

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

我懷疑請求的230秒超時限制會導致此問題。 正如David Ebbo在此主題中所說:

對於沒有發回任何數據的請求,有230秒(即不到4分鍾)的超時。 之后,即使實際上允許請求繼續服務器端,客戶端也會獲得您看到的500。

為解決此問題,我在Web服務上創建了一些請求管理。 通過使用System.ServiceModel.Dispatcher.IDispatchMessageInspector ,它跟蹤每個開始和結束的請求。 現在可以通過新的Web服務檢索這些請求的狀態。

結果:

Azure Webjob啟動持久請求,當它花費超過230秒時,它將捕獲超時異常,並將使用新的Web服務來繼續檢查原始(持久)請求的狀態,直到完成為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM