2016-12-07 5 views
0

Я создаю Azure Webjob, который будет отправлять данные из моего хранилища blob на другой (не лазурный) веб-сервис, который работает в моей клиентской среде. Обработка этого http-POST может занять очень много времени (не менее 30 минут), что прекрасно, потому что ни один пользователь не ждет завершения этого процесса.Долговечный пост http, не возвращающийся в Azure Webjob

После поиска в Интернете и тестирования в течение дня мой тест выглядит следующим образом.

  • У Webservice есть метод тестирования, который возвращается после ожидания в течение 10 минут.
  • Azure Webjob будет вызывать метод тестирования с использованием System.Net.Http.HttpClient с Timeout, установленным на 11 минут.
  • В родительском веб-приложении Azure под ApplicationSettings, Always On установлено значение true и установка приложения WEBJOBS_IDLE_TIMEOUT установлена ​​в 3600.
  • Пока Azure Webjob ждет, он будет выполнять Console.WriteLine("Heartbeat") каждую секунду (чтобы работать во время холостого процессора).

Это приведет к System.Threading.Tasks.TaskCanceledException: A task was canceled. Когда я запустил тот же тест из Visual Studio, он завершится успешно после ожидания в течение 10 минут.

Я что-то упустил? Что происходит?

EDIT: Включает код из моего теста, а также исключение и стек.

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 
+0

Вы пытались увеличить SCM_COMMAND_IDLE_TIMEOUT в своем веб-приложении Azure? – iikkoo

+0

Привет, @iikkoo, спасибо за ваше предложение, но, к сожалению, это не сработало. Те же результаты –

+0

Можете ли вы опубликовать полное исключение и трассировку? – iikkoo

ответ

0

Я подозреваю, что 230 секунд Тайм-аут ограничения запроса вызывает проблему. Как сказал Дэвид Эббо в this thread:

Существует 230 второй (т.е. немного меньше, чем за 4 минуты) Время ожидания для запросов, которые не посылая любые данные обратно. После этого клиент получает 500, которые вы видели, хотя на самом деле запрос разрешен для продолжения на стороне сервера.

+0

Действительно, Фред, похоже, проблема. Я отвечу, чтобы показать свою работу. –

0

Как работа вокруг этой проблемы, я создал некоторое управление запросами на моем веб-сервисе. Он отслеживает каждый запрос, который начинается и заканчивается, используя System.ServiceModel.Dispatcher.IDispatchMessageInspector. И статус этих запросов теперь можно получить через новый веб-сервис.

Результат:

Лазурное Webjob начинается длительный запрос, и когда он занимает более 230 секунд он будет ловить исключение таймаута и будет использовать новый веб-сервис, чтобы проверить статус оригинала (продолжительный), пока он не будет завершен.

 Смежные вопросы

  • Нет связанных вопросов^_^