Exemplo n.º 1
0
        async Task <DurableHttpResponse> IDurableOrchestrationContext.CallHttpAsync(DurableHttpRequest req)
        {
            DurableHttpResponse durableHttpResponse = await this.ScheduleDurableHttpActivityAsync(req);

            HttpStatusCode currStatusCode = durableHttpResponse.StatusCode;

            while (currStatusCode == HttpStatusCode.Accepted && req.AsynchronousPatternEnabled)
            {
                Dictionary <string, StringValues> headersDictionary = new Dictionary <string, StringValues>(durableHttpResponse.Headers);
                DateTime fireAt = default(DateTime);
                if (headersDictionary.ContainsKey("Retry-After"))
                {
                    fireAt = this.InnerContext.CurrentUtcDateTime.AddSeconds(int.Parse(headersDictionary["Retry-After"]));
                }
                else
                {
                    fireAt = this.InnerContext.CurrentUtcDateTime.AddMilliseconds(this.Config.Options.HttpSettings.DefaultAsyncRequestSleepTimeMilliseconds);
                }

                this.IncrementActionsOrThrowException();
                await this.InnerContext.CreateTimer(fireAt, CancellationToken.None);

                DurableHttpRequest durableAsyncHttpRequest = this.CreateHttpRequestMessageCopy(req, durableHttpResponse.Headers["Location"]);
                durableHttpResponse = await this.ScheduleDurableHttpActivityAsync(durableAsyncHttpRequest);

                currStatusCode = durableHttpResponse.StatusCode;
            }

            return(durableHttpResponse);
        }
Exemplo n.º 2
0
        public async override Task <string> RunAsync(TaskContext context, string rawInput)
        {
            DurableHttpRequest durableHttpRequest = ReconstructDurableHttpRequest(rawInput);
            HttpRequestMessage requestMessage     = await this.ConvertToHttpRequestMessage(durableHttpRequest);

            HttpResponseMessage response;

            if (durableHttpRequest.Timeout == null)
            {
                response = await this.httpClient.SendAsync(requestMessage);
            }
            else
            {
                try
                {
                    using (CancellationTokenSource cts = new CancellationTokenSource())
                    {
                        cts.CancelAfter(durableHttpRequest.Timeout.Value);
                        response = await this.httpClient.SendAsync(requestMessage, cts.Token);
                    }
                }
                catch (OperationCanceledException ex)
                {
                    TimeoutException e = new TimeoutException(ex.Message + $" Reached user specified timeout: {durableHttpRequest.Timeout.Value}.");

                    string details = Utils.SerializeCause(e, this.config.ErrorDataConverter);
                    throw new TaskFailureException(e.Message, e, details);
                }
            }

            DurableHttpResponse durableHttpResponse = await DurableHttpResponse.CreateDurableHttpResponseWithHttpResponseMessage(response);

            return(JsonConvert.SerializeObject(durableHttpResponse));
        }
        /// <summary>
        /// Creates a DurableHttpResponse from an HttpResponseMessage.
        /// </summary>
        /// <param name="httpResponseMessage">HttpResponseMessage returned from the HTTP call.</param>
        /// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
        public static async Task <DurableHttpResponse> CreateDurableHttpResponseWithHttpResponseMessage(HttpResponseMessage httpResponseMessage)
        {
            DurableHttpResponse durableHttpResponse = new DurableHttpResponse(
                statusCode: httpResponseMessage.StatusCode,
                headers: CreateStringValuesHeaderDictionary(httpResponseMessage.Headers),
                content: await httpResponseMessage.Content.ReadAsStringAsync());

            return(durableHttpResponse);
        }
        public async override Task <string> RunAsync(TaskContext context, string rawInput)
        {
            HttpRequestMessage requestMessage = await this.ReconstructHttpRequestMessage(rawInput);

            HttpResponseMessage response = await this.httpClient.SendAsync(requestMessage);

            DurableHttpResponse durableHttpResponse = await DurableHttpResponse.CreateDurableHttpResponseWithHttpResponseMessage(response);

            return(JsonConvert.SerializeObject(durableHttpResponse));
        }
Exemplo n.º 5
0
        private async Task <DurableHttpResponse> ScheduleDurableHttpActivityAsync(DurableHttpRequest req)
        {
            DurableHttpResponse durableHttpResponse = await this.CallDurableTaskFunctionAsync <DurableHttpResponse>(
                functionName : HttpOptions.HttpTaskActivityReservedName,
                functionType : FunctionType.Activity,
                oneWay : false,
                instanceId : null,
                operation : null,
                retryOptions : null,
                input : req);

            return(durableHttpResponse);
        }