Мне нужна помощь, чтобы выяснить, почему следующий код в блоке continueWith не выполняется для длительного вызова службы.

     public static async void postServiceAsync(string json, string postServiceUrl, string callbackUrl, string clientId, 
                                                  string tenant, string secret, string d365Environment, TraceWriter log)
        {
            HttpClient client = new HttpClient();

            //Get authorization header
            string authHeader = await D365Authorization.getAccessToken(clientId, tenant, secret, d365Environment);
            client.DefaultRequestHeaders.Add("Authorization", authHeader);
            var httpContent = new StringContent(json);

            client.Timeout = TimeSpan.FromMinutes(90);
            client.PostAsync(postServiceUrl, httpContent).ContinueWith(async (result) =>
            {
               //call callback URL
               //This is not executed after a long running service that runs for 20 minutes.
             }
         }

Однако код continueWith запускается, если время выполнения службы невелико. Я подумал, что это проблема с тайм-аутом, поэтому добавил значение client.Timeout. Я попытался вызвать службу в Postman, и значение возвращается даже после ожидания более 20 минут. Я не использую ожидание, так как хочу, чтобы выполнение продолжалось после вызова PostAsync. Я просто хочу, чтобы обратный вызов continueWith выполнялся после завершения длительного выполнения службы. Спасибо за вашу помощь!

Вышеупомянутый метод postServiceAsync вызывается из функции Azure, которая вызывается из действия http webhook приложения Azure Logic. Вот функция Azure:

public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
        {
            ...

            PostServiceAsync.postServiceAsync(json, shipServiceUrl, callbackUrl, clientId, tenant, secret, d365Environment, log);

            var resp = req.CreateResponse(HttpStatusCode.Accepted);
            return resp;
        }
    }

Из функции Azure мне нужно сразу же вернуть код состояния "Принято". После того, как я завершил вызов долго работающей службы с помощью PostAsync, мне нужно отправить сообщение по URL-адресу обратного вызова, что я и делаю в блоке continueWith. Как я уже упоминал, он работает, если время выполнения службы невелико. Я попробовал предложение Камило добавить ожидание, но код continueWith не был выполнен. Я также попытался избавиться от continueWith и просто добавил код после "await client.PostAsync (...)".

-2
doritoslover 12 Мар 2019 в 03:32

1 ответ

Лучший ответ

Оказывается, есть 230-секундный тайм-аут функции Azure для HTTP-вызовов без ответа. Возможно, я не смогу использовать функцию Azure для своих целей.

0
doritoslover 12 Мар 2019 в 17:40