HttpClient.PostAsync продолжить без выполнения - PullRequest
0 голосов
/ 12 марта 2019

Мне нужна помощь, чтобы выяснить, почему следующий код в блоке 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.Я попытался позвонить в службу почтальона, и значение возвращается даже после ожидания более 20 минут.Я не использую await, так как хочу, чтобы выполнение продолжалось после вызова PostAsync.Я просто хочу, чтобы обратный вызов continueWith выполнялся после того, как долгосрочное выполнение службы завершилось.Спасибо за вашу помощь!

Вышеприведенный метод postServiceAsync вызывается из функции Azure, которая вызывается из действия http webhook приложения логики Azure.Вот функция 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.Как я уже упоминал, это работает, если время выполнения службы короткое.Я попытался предложить Камило добавить await, но код continueWith не был выполнен.Я также попытался избавиться от continueWith и просто добавил код после «await client.PostAsync (...)».

1 Ответ

0 голосов
/ 12 марта 2019

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

...